免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      JDBC 在性能測(cè)試中的應(yīng)用

      JDBC 在性能測(cè)試中的應(yīng)用

      前言

      Cloud Native

      我們能否繞開(kāi) http 協(xié)議,直接測(cè)試數(shù)據(jù)庫(kù)性能?是否覺(jué)得從數(shù)據(jù)庫(kù)中導(dǎo)出 CSV 文件來(lái)構(gòu)造壓測(cè)數(shù)據(jù)很麻煩?怎樣在壓測(cè)結(jié)束后做數(shù)據(jù)清理?能不能通過(guò)數(shù)據(jù)庫(kù)中的插入(刪除)記錄對(duì)壓測(cè)請(qǐng)求做斷言?使用阿里云性能測(cè)試工具 PTS 可以輕松解決上述問(wèn)題。

      什么是 JDBC

      Cloud Native

      JDBC(Java DataBase Connectivity,Java 數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行 SQL 語(yǔ)句的 Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用 Java 語(yǔ)言編寫(xiě)的類(lèi)和接口組成。JDBC 提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。

      簡(jiǎn)單地說(shuō),JDBC 可做三件事:與數(shù)據(jù)庫(kù)建立連接、發(fā)送操作數(shù)據(jù)庫(kù)的語(yǔ)句并處理結(jié)果。

      JDBC 的設(shè)計(jì)原理

      Cloud Native

      1

      整體架構(gòu)

      JDBC 制定了一套和數(shù)據(jù)庫(kù)進(jìn)行交互的標(biāo)準(zhǔn),數(shù)據(jù)庫(kù)廠商提供這套標(biāo)準(zhǔn)的實(shí)現(xiàn),這樣就可以通過(guò)統(tǒng)一的 JDBC 接口來(lái)連接各種不同的數(shù)據(jù)庫(kù)??梢哉f(shuō) JDBC 的作用是屏蔽了底層數(shù)據(jù)庫(kù)的差異,使得用戶(hù)按照 JDBC 寫(xiě)的代碼可以在各種不同的數(shù)據(jù)庫(kù)上進(jìn)行執(zhí)行。那么這是如何實(shí)現(xiàn)的呢?如下圖所示:

      JDBC 定義了 Driver 接口,這個(gè)接口就是數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序, 所有跟數(shù)據(jù)庫(kù)打交道的操作最后都會(huì)歸結(jié)到這里 ,數(shù)據(jù)庫(kù)廠商必須實(shí)現(xiàn)該接口,通過(guò)這個(gè)接口來(lái)完成上層應(yīng)用的調(diào)用者和底層具體的數(shù)據(jù)庫(kù)進(jìn)行交互。Driver 是通過(guò) JDBC 提供的 DriverManager 進(jìn)行注冊(cè)的,注冊(cè)的代碼寫(xiě)在了 Driver 的靜態(tài)塊中,如 MySQL 的注冊(cè)代碼如下所示:

      static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException(“Can’t register driver!”); } }作為驅(qū)動(dòng)定義的規(guī)范 Driver,它的主要目的就是和數(shù)據(jù)庫(kù)建立連接,所以其接口也很簡(jiǎn)單,如下所示:public interface Driver { //建立連接 Connection connect(String url, java.util.Properties info) throws SQLException; boolean acceptsURL(String url) throws SQLException; DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info) throws SQLException; int getMajorVersion(); int getMinorVersion(); boolean jdbcCompliant(); public Logger getParentLogger() throws SQLFeatureNotSupportedException;}

      作為 Driver 的管理者 DriverManager,它不僅負(fù)責(zé) Driver 的注冊(cè)/注銷(xiāo),還可以直接獲取連接。它是怎么做到的呢?觀察下面代碼發(fā)現(xiàn),實(shí)際是通過(guò)遍歷所以已經(jīng)注冊(cè)的 Driver,找到一個(gè)能夠成功建立連接的 Driver,并且將 Connection 返回,DriverManager 就像代理一樣,將真正建立連接的過(guò)程還是交給了具體的 Driver。

      for(DriverInfo aDriver : registeredDrivers) { // If the caller does not have permission to load the driver then // skip it. if(isDriverAllowed(aDriver.driver, callerCL)) { try { println(” trying ” + aDriver.driver.getClass().getName()); Connection con = aDriver.driver.connect(url, info); if (con != null) { // Success! println(“getConnection returning ” + aDriver.driver.getClass().getName()); return (con); } } catch (SQLException ex) { if (reason == null) { reason = ex; } } } else { println(” skipping: ” + aDriver.getClass().getName()); } }

      2

      Connection 設(shè)計(jì)

      通過(guò)上節(jié)我們知道數(shù)據(jù)庫(kù)提供商通過(guò)實(shí)現(xiàn)Driver接口來(lái)向用戶(hù)提供服務(wù),Driver接口的核心方法就是獲取連接。Connection是和數(shù)據(jù)庫(kù)打交道的核心接口,下面我們看看它的設(shè)計(jì)方案。

      通過(guò)觀察設(shè)計(jì)圖我們發(fā)現(xiàn)主要有兩類(lèi)接口:DataSource 和 Connection。下面我們逐一進(jìn)行介紹。

      • DataSource

      直接看源碼,如下所示,發(fā)現(xiàn)它的核心方法竟然和 Driver 一樣,也是獲取連接。那為什么還要 DataSource 呢?Driver 本身不就是獲取連接的嗎?下面我們就看看 DataSource 到底是怎么獲取連接的。

      public interface DataSource extends CommonDataSource, Wrapper { Connection getConnection() throws SQLException; Connection getConnection(String username, String password) throws SQLException;}

      然而我們發(fā)現(xiàn) JDBC 只定義了 DataSource 的接口,并沒(méi)有給出具體實(shí)現(xiàn),下面我們就以 Spring 實(shí)現(xiàn)的 SimpleDriverDataSource 為例,來(lái)看看它是怎么做的,代碼如下所示,發(fā)現(xiàn) DataSource 的 getConnection(…)方法,最后竟然還是交由 driver.connect(…)去真正建立連接。所以又回到最開(kāi)始我們所描述的, Driver 才是真正的與數(shù)據(jù)庫(kù)打交道的接口。

      protected Connection getConnectionFromDriver(Properties props) throws SQLException { Driver driver = getDriver(); String url = getUrl(); Assert.notNull(driver, “Driver must not be null”); if (logger.isDebugEnabled()) { logger.debug(“Creating new JDBC Driver Connection to [” + url + “]”); } return driver.connect(url, props); }

      那么問(wèn)題來(lái)了,為什么還需要 DataSource 這樣的接口,豈不多此一舉么?顯然不會(huì)。DataSource 是加強(qiáng)版的 Driver。它將核心的建立連接的過(guò)程交由 Driver 執(zhí)行,而對(duì)于建立緩存,處理分布式事務(wù)和連接池等看似與建立連接無(wú)關(guān)的事情自己來(lái)處理。如類(lèi)的設(shè)計(jì)圖所示,以 PTS 使用的 Druid 連接池為例:

      • ConnectionPoolDataSource:連接池的實(shí)現(xiàn),此數(shù)據(jù)源實(shí)現(xiàn)并不直接創(chuàng)建數(shù)據(jù)庫(kù)物理連接,而是一個(gè)邏輯實(shí)現(xiàn),它的作用在于池化數(shù)據(jù)庫(kù)物理連接。
      • PooledConnection:配合 ConnectionPoolDataSource,由它獲取一個(gè)池化對(duì)象 PooledConnection,再通過(guò)該 PooledConnection 間接獲取到物理連接。

      顯然,通過(guò)連接池我們可以從連接的管理中抽身,提高連接的利用效率,也能提升壓力機(jī)的施壓能力。

      3

      Statement 設(shè)計(jì)

      建立連接之后,用戶(hù)可能要開(kāi)始寫(xiě) SQL 語(yǔ)句,并且交由數(shù)據(jù)庫(kù)去執(zhí)行了。這些是通過(guò) Statement 來(lái)實(shí)現(xiàn)的。主要分為:

      • Statement:定義一個(gè)靜態(tài)的 SQL 語(yǔ)句,數(shù)據(jù)庫(kù)每次執(zhí)行都需要重新編譯,一般用于僅執(zhí)行一次查詢(xún)并返回結(jié)果的情形。
      • PreparedStatement:定義一個(gè)帶參的預(yù)編譯的 SQL 語(yǔ)句,下次執(zhí)行時(shí),會(huì)從緩存中取出遍以后的語(yǔ)句,而不需要重新編譯一遍,適用于執(zhí)行多次相同邏輯的 SQL 語(yǔ)句,當(dāng)然它還有防 SQL 注入等功能,安全性和效率較高,使用比較頻繁。對(duì)于性能測(cè)試來(lái)說(shuō),選擇 PreparedStatement 最為合適。
      • CallableStatement:用來(lái)調(diào)用存儲(chǔ)過(guò)程。

      4

      ResultSet 設(shè)計(jì)

      JDBC 使用 ResultSet 接口來(lái)承接 Statement 的執(zhí)行結(jié)果。ResultSet 使用指針的方式(next())來(lái)逐條獲取檢索結(jié)果,當(dāng)指針指向某條數(shù)據(jù)時(shí),用戶(hù)可以自由的選擇獲取某一列的數(shù)據(jù)。PTS 通過(guò)將 ResultSet 轉(zhuǎn)化成 CSV 文件,輔助用戶(hù)以一條 SQL 語(yǔ)句,構(gòu)造復(fù)雜的壓測(cè)數(shù)據(jù)。

      5

      JDBC 架構(gòu)總結(jié)

      通過(guò)上面的介紹我們發(fā)現(xiàn),JDBC 的設(shè)計(jì)還是層次感分明的。

      (1)Driver 和 DriverManager 是面向數(shù)據(jù)庫(kù)的,設(shè)計(jì)了一套 Java 訪問(wèn)數(shù)據(jù)的規(guī)范,數(shù)據(jù)庫(kù)廠商只需要實(shí)現(xiàn)這套規(guī)范即可;

      (2)DataSource 和 Connection 是面向應(yīng)用程序開(kāi)發(fā)者的,它們不關(guān)心 JDBC 具體是如何跟數(shù)據(jù)庫(kù)進(jìn)行交互的,通過(guò)統(tǒng)一的 DataSource 接口就可以拿到 Connection,用戶(hù)的數(shù)據(jù)操作都可以通過(guò)這個(gè) Connection 來(lái)實(shí)現(xiàn)了;

      (3)Statement 承載了具體的 SQL 命令,用戶(hù)可以定義不同的 Statement 來(lái)向數(shù)據(jù)庫(kù)發(fā)送指令;

      (4)ResultSet 是用來(lái)承載 SQL 命令的執(zhí)行結(jié)果。

      至此,完成了 加載驅(qū)動(dòng) -> 建立連接 -> 執(zhí)行命令 -> 返回結(jié)果 這樣的和數(shù)據(jù)庫(kù)交互的整個(gè)過(guò)程。如果把這個(gè)過(guò)程靈活的嵌入到 PTS 性能測(cè)試中,便可以解決前言提到的各種問(wèn)題。

      JDBC 在性能測(cè)試中的應(yīng)用

      Cloud Native

      1

      數(shù)據(jù)庫(kù)性能測(cè)試

      • 背景

      大多數(shù)對(duì)數(shù)據(jù)庫(kù)的操作都是通過(guò) HTTP、FTP 或其他協(xié)議執(zhí)行的,但是在某些情況下,繞開(kāi)中間協(xié)議直接測(cè)試數(shù)據(jù)庫(kù)也很有意義。例如我們希望不觸發(fā)所有相關(guān)查詢(xún),而只測(cè)試特定 high-value 查詢(xún)的性能;驗(yàn)證新數(shù)據(jù)庫(kù)在高負(fù)載下的性能。2.驗(yàn)證某些數(shù)據(jù)庫(kù)連接池參數(shù),例如最大連接數(shù) 3.節(jié)省時(shí)間和資源。當(dāng)我們想要優(yōu)化 SQL 時(shí),修改代碼中的 SQL 語(yǔ)句和其他數(shù)據(jù)庫(kù)操作非常繁瑣,通過(guò) JDBC 壓測(cè),我們可以避免侵入代碼,集中精力在 SQL 調(diào)優(yōu)上。

      • 步驟

      1、創(chuàng)建場(chǎng)景。 我們?cè)?PTS 控制臺(tái)的【壓測(cè)中心】->【 創(chuàng)建場(chǎng)景 】中創(chuàng)建 PTS 壓測(cè)場(chǎng)景;

      2、場(chǎng)景配置。PTS 支持對(duì) MySQL、PostgreSQL 等四種數(shù)據(jù)庫(kù)發(fā)起壓測(cè)。用戶(hù)填寫(xiě) JDBC URL、用戶(hù)名、密碼和 SQL 即可發(fā)起壓測(cè)。同時(shí),PTS 還支持提取 ResultSet 中的數(shù)據(jù)作為出參,給下游 API 使用;對(duì)響應(yīng)進(jìn)行斷言。

      3、壓測(cè)中監(jiān)控和壓測(cè)報(bào)告。PTS 支持綁定阿里云 RDS 云資源監(jiān)控,在壓測(cè)過(guò)程中觀察 RDS 實(shí)時(shí)性能指標(biāo)。此外,PTS 還提供清晰完備的壓測(cè)報(bào)告以及采樣日志,供用戶(hù)隨時(shí)查看。

      2

      壓測(cè)數(shù)據(jù)構(gòu)造

      • 背景

      在模擬不同用戶(hù)登錄、壓測(cè)業(yè)務(wù)參數(shù)傳遞等場(chǎng)景中,需要使用參數(shù)功能來(lái)實(shí)現(xiàn)壓測(cè)的請(qǐng)求中各種動(dòng)態(tài)操作。如果使用傳統(tǒng)的 CSV 文件參數(shù),會(huì)受到文件大小的限制,且手動(dòng)創(chuàng)建耗費(fèi)精力。使用 JDBC 來(lái)構(gòu)造壓測(cè)數(shù)據(jù),可以避免以上問(wèn)題。

      • 步驟

      1、 添加數(shù)據(jù)源。 在場(chǎng)景編輯-數(shù)據(jù)源管理中,選擇添加 DB 數(shù)據(jù)源,輸入 URL、用戶(hù)名、密碼和 SQL。

      2、添加參數(shù)。填寫(xiě)自定義參數(shù)名和列索引。

      3、調(diào)試驗(yàn)證。點(diǎn)擊調(diào)試場(chǎng)景,即可驗(yàn)證提取的結(jié)果集是否符合預(yù)期。接著,我們就可以在任意想要使用參數(shù)的地方使用${}引用即可。

      3

      壓測(cè)臟數(shù)據(jù)清理

      • 背景

      針對(duì)寫(xiě)請(qǐng)求的壓測(cè),會(huì)在數(shù)據(jù)庫(kù)中生成大量臟數(shù)據(jù)。如何在壓測(cè)結(jié)束后自動(dòng)清理?

      • 步驟

      PTS 給用戶(hù)提供了解決方案。PTS 支持對(duì)串聯(lián)鏈路作邏輯上的順序編排,即前置鏈路、普通鏈路和后置鏈路。執(zhí)行順序由先到后。設(shè)置某條串聯(lián)鏈路為后置鏈路,填寫(xiě)循環(huán)次數(shù)即可。

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
      用戶(hù)投稿
      上一篇 2022年6月22日 18:18
      下一篇 2022年6月22日 18:20

      相關(guān)推薦

      • 分享4條發(fā)微商朋友圈的方法(微商朋友圈應(yīng)該怎么發(fā))

        對(duì)于微商朋友來(lái)說(shuō),朋友圈的重要性不言而喻了。 那么微商的朋友圈到底該怎么發(fā)呢? 為什么同樣是經(jīng)營(yíng)一個(gè)朋友圈,有的微商看起來(lái)逼格滿(mǎn)滿(mǎn),實(shí)際效果也不錯(cuò);而有的卻動(dòng)都不動(dòng)就被屏蔽甚至拉黑…

        2022年11月27日
      • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

        今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋?zhuān)绻芘銮山鉀Q你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

        2022年11月26日
      • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

        CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

        2022年11月25日
      • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

        如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開(kāi)通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

        2022年11月24日
      • OPPO Reno9 Pro+硬件規(guī)格強(qiáng) 搭載驍龍8+旗艦處理器

        OPPO Reno9系列正式發(fā)布,Reno9 Pro+作為三款新機(jī)中定位最高的超大杯機(jī)型,整體配置較上一代有著大幅度的升級(jí),如果單看硬件配置的話,Reno9 Pro+甚至是目前OP…

        2022年11月24日
      • 成都健康碼打不開(kāi)顯示接口請(qǐng)求未知異常怎么辦(成都健康碼打不開(kāi)顯示接口請(qǐng)求未知異常)

        成都這幾天的疫情也是備受關(guān)注,疫情期間各地出行都是需要查看健康碼的,不過(guò)今天卻有成都的小伙伴反饋健康碼無(wú)法打開(kāi)的情況。成都健康碼打不開(kāi)顯示接口請(qǐng)求未知異常怎么辦?由于健康碼無(wú)法打開(kāi)…

        2022年11月24日
      • 銳龍97900x參數(shù)規(guī)格跑分評(píng)測(cè) 銳龍97900x屬于什么檔次

        銳龍9 7900X是銳龍7000系列處理器中性能頂尖的型號(hào)之一,它采用了這一代標(biāo)配的zen4架構(gòu)和5nm制程工藝,那么它具體的參數(shù)跑分如何,在電腦上世紀(jì)發(fā)揮怎么樣呢,下面就來(lái)看看銳…

        2022年11月24日
      • 1千克等于多少磅

        克,此定義在1958年被美國(guó)以及其他英聯(lián)邦會(huì)員國(guó)承認(rèn)換算回來(lái),一千克等于262磅,一磅等于037千克英國(guó)在1963年開(kāi)始,依據(jù)度量衡法案的規(guī);1 磅=16 盎司=04536 千克 …

        2022年11月24日
      • 明查|美國(guó)新冠后遺癥患者中有16%癥狀嚴(yán)重以致無(wú)法工作?

        點(diǎn)擊進(jìn)入澎湃新聞全球事實(shí)核查平臺(tái) 速覽 – 網(wǎng)傳數(shù)據(jù)比例無(wú)權(quán)威信源佐證,該比例有可能是結(jié)合了美國(guó)疾病防控中心和布魯金斯學(xué)會(huì)的數(shù)據(jù)得出,但這兩個(gè)機(jī)構(gòu)的調(diào)研目的和樣本都不同…

        2022年11月24日
      • vivox90pro配置參數(shù)跑分詳情 vivox90pro是什么屏幕

        vivox90pro參數(shù)配置詳情怎么樣?vivo手機(jī)在昨晚舉行了X90系列發(fā)布會(huì),有普通款、pro款以及pro+款三個(gè)版本,那么vivox90pro具體配置怎么樣呢?下面就讓小編為…

        2022年11月23日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息