<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # JDBC 性能優化技巧 > 原文: [https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/](https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/) [**Java 數據庫連接(JDBC)**](//howtodoinjava.com/category/java/jdbc/ "JDBC")是標準應用編程接口(API)的 JavaSoft 規范,允許 Java 程序訪問數據庫管理系統。 JDBC API 由一組用 Java 編程語言編寫的接口和類組成。 使用這些標準接口和類,程序員可以編寫連接數據庫的應用,發送以結構化查詢語言(SQL)編寫的查詢,并處理結果。 JDBC 面向關系數據庫。 雖然不再標準直接在您的應用中使用 JDBC,因為我們有許多更健壯的 API 可以為我們完成這項工作,例如 [**Hiberate**](//howtodoinjava.com/hibernate-tutorials/ "hibernate") 和 [**iBatis**](//howtodoinjava.com/ibatis/ "ibatis") 。 但是,如果由于特定的要求而仍然被您吸引,或者只是在學習它,那么下面的建議將幫助您編寫更快速和有效的代碼。 ![JDBC-Icon](https://img.kancloud.cn/1c/97/1c97cbc2085a82c3870087e272080b29_335x146.png) ```java Sections in this post: Use Object Pooling Consider MetaData Performance Choose Commit Mode carefully Save Some Bytes On Network Traffic ``` 讓我們直接進入討論。 ## 幾乎始終使用對象池 對象池可以發生在兩個方面: **1)連接池**:由于在后端數據庫中建立網絡連接和初始化數據庫連接會話會產生開銷,因此創建數據庫連接通常很昂貴。 反過來,連接會話初始化通常需要耗時的處理來執行用戶認證,建立事務上下文以及建立后續數據庫使用所需的會話的其他方面。 此外,數據庫對所有連接會話的持續管理可能會對應用的可伸縮性施加主要限制因素。 基于并發連接會話的數量,諸如鎖,內存,游標,事務日志,語句句柄和臨時表之類的寶貴數據庫資源都傾向于增加。 **啟用連接池允許池管理器在關閉連接后將其保留在“池”中**。 下次需要連接時,如果請求的連接選項與池中的連接選項匹配,則將返回該連接,而不會產生與服務器建立另一個實際套接字連接的開銷。 順便說一句,您不需要為連接池管理器實現自己的邏輯。 您可以使用服務器上提供的某些功能。 例如:[http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html](https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html) **2)語句池**:從 JDBC 3.0 開始,JDBC 標準定義了一個語句緩存接口。 設置`MaxPooledStatements`連接選項將啟用語句池。 **啟用語句池使驅動可以重新使用 Prepared Statement 對象**。 關閉`PreparedStatement`后,它們將返回到池中而不是被釋放,并且從池中檢索下一個具有相同 SQL 語句的`PreparedStatement`,而不是針對服務器實例化和準備該語句。 語句緩存可以執行以下操作: 1. 防止重復創建游標的開銷 2. 防止重復的語句解析和創建 3. 重用客戶端中的數據結構 請確保您的驅動支持此功能,并且默認情況下是否啟用它。 如果您以編程方式進行操作,則示例代碼可能是這樣的。 ```java Properties p = new Properties(); p.setProperty("user", "root"); p.setProperty("password", "password"); p.setProperty("MaxPooledStatements", "200"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/JDBCDemo", p); ``` 在此處閱讀有關語句池的更多信息:[http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm](https://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm) ## 同時考慮元數據性能 如果要在代碼中處理元數據,那么這是需要注意的另一個重要方面。 這里的第一個技巧是**使用盡可能多的參數(或過濾器)來獲取**指定的元數據。 例如,不要像這樣調用`getTables`: ```java DatabaseMetaData dbmd = connection.getMetaData(); ResultSet rs = dbmd.getTables(null,null,null,null); ``` 在將請求發送到服務器時,至少指定模式將避免在每個表的所有表上返回信息: ```java DatabaseMetaData dbmd = connection.getMetaData(); ResultSet rs = dbmd.getTables(null,"testDB",null,null); ``` 其次,請記住,大多數 JDBC 驅動在選擇查詢中返回所需數據時,會在提取時填充`ResultSetMetaData`對象。 使用此信息,而不是從`DatabaseMetaData`獲取數據,這是附加請求,在大多數情況下是可以避免的。 ```java selectStmt = connection.createStatement(); ResultSet rs = selectStmt.executeQuery("SELECT ID,FIRST_NAME,LAST_NAME,STAT_CD FROM EMPLOYEE WHERE ID <= 10"); ResultSetMetaData rsmd = rs.getMetaData(); rsmd.getColumnCount(); rsmd.getColumnName(0); rsmd.getColumnType(0); rsmd.getColumnTypeName(0); rsmd.getColumnDisplaySize(0); rsmd.getPrecision(0); rsmd.getScale(0); ``` 提示:可以考慮發出一個虛擬查詢并使用返回的`ResultSetMetaData`來避免查詢系統表,而不是使用`getColumns`獲取有關表的數據! ## 仔細選擇提交模式 在編寫 JDBC 應用時,請確保考慮提交事務的頻率。 每次提交都會導致驅動通過套接字發送數據包請求。 此外,數據庫執行實際的提交,通常需要在服務器上進行磁盤 I/O。 **考慮為您的應用**刪除自動提交模式,而改為使用手動提交以更好地控制提交邏輯。 使用的代碼是: ```java Connection.setAutoCommit(false); ``` ## 在網絡流量上節省一些字節 為了減少網絡流量,可以查看以下建議并對其進行調整以適合您的應用。 1. **使用大容量客戶端**時,請使用`addBatch()`而不是使用`PreparedStatement`來插入數據。 這會在一個網絡數據包中發送多個插入請求,并為您節省一些字節。 2. **不要使用“`SELECT * FROM TABLE`”**。 而是指定實際需要的列名稱。 我建議您將其作為一種習慣,因為我們很多時候都在這樣做,卻沒有意識到它的負面影響。 試想一下,如果您在還要存儲 BLOB 的表中執行此操作。 您從數據庫中獲取了如此重的對象,并且不使用它。 真是浪費 3. **確保您的數據庫設置了最大數據包大小**,并且驅動與該數據包大小匹配。 為了獲取更大的結果集,這減少了驅動和服務器之間發送/接收的總數據包數量。 這就是這篇文章的全部內容。 如果您有任何疑問,請發表評論。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看