
- JDBC 教程
- JDBC - 首頁
- JDBC - 簡介
- JDBC - SQL 語法
- JDBC - 環境
- JDBC - 示例程式碼
- JDBC - 驅動程式型別
- JDBC - 連線
- JDBC - 語句
- JDBC - 結果集
- JDBC - 資料型別
- JDBC - 事務
- JDBC - 異常
- JDBC - 批次處理
- JDBC - 儲存過程
- JDBC - 資料流
- JDBC - RowSet
- JDBC - 複製資料庫
- JDBC - ACID 屬性
- JDBC - 連線池
- JDBC 示例
- JDBC - 建立資料庫
- JDBC - 選擇資料庫
- JDBC - 刪除資料庫
- JDBC - 建立表
- JDBC - 刪除表
- JDBC - 插入記錄
- JDBC - 選擇記錄
- JDBC - 更新記錄
- JDBC - 刪除記錄
- JDBC - WHERE 子句
- JDBC - LIKE 子句
- JDBC - 資料排序
- JDBC 有用資源
- JDBC - 常見問題解答
- JDBC - 快速指南
- JDBC - 有用資源
- JDBC - 討論
- 有用 - Java 教程
JDBC - 連線池
對於流量很大的網站,獲取資料庫連線的資源可能非常昂貴。此外,想象一下,一個網站有 500 個併發使用者,每個使用者都試圖獲取一個連線來選擇或更新資料。在這種情況下,為了防止多個使用者破壞資料,資料庫會使用鎖。當一個使用者對一個表進行選擇操作時,該表會被鎖定。除非釋放鎖,否則其他使用者無法獲取該表。讓 500 個使用者等待連線是不可接受的。
Java 中的連線池是一種用於提高資料庫驅動應用程式效能的技術。與其每次應用程式需要與資料庫互動時都建立一個新的連線,不如建立一個連線池,並由連線池管理器進行管理。這消除了每次建立新連線的開銷,從而導致更快的響應時間和更好的資源利用率。
連線池的優點
以下是連線池的優點。
效能提升 - 連線池減少了建立和關閉連線的開銷,從而使應用程式的響應時間更快。
資源最佳化 - 透過重用連線,連線池有助於節省系統資源,例如記憶體和網路連線。
可擴充套件性 - 連線池可以根據需求動態增長或縮小,允許您的應用程式處理不同的工作負載。
流行的連線池庫
以下是流行的連線池庫。
HikariCP - 以其效能和效率而聞名。
Apache Commons DBCP - 使用廣泛且久負盛名。
c3p0 - 另一個流行的選擇,專注於穩定性。
示例:使用 HikariCP 的連線池
我們將使用 HikariCP 連線池庫。在 Eclipse 中,轉到檔案 -> 新建 -> Java 專案。
將專案的名稱設定為HikariCPExample。單擊完成。現在在專案資源管理器中,右鍵單擊專案名稱,選擇構建路徑 -> 新增外部存檔。新增以下 3 個 jar 包HikariCP-5.0.1.jar - 從 HikariCP-5.0.1.jar 下載
mysql-connector-j-8.4.0.jar - 從 mysql-connector-j-8.4.0.jar 下載
slf4j-api-2.1.0-alpha1.jar - 從 slf4j-api-2.1.0-alpha1.jar 下載
在 Eclipse 中,單擊選單檔案 -> 新建類以建立一個新類。將檔案命名為HikariCPManager。不要為包名填寫任何內容。單擊完成。
在 Eclipse 中,單擊檔案 -> 新建類。將檔案命名為TestPooledConnection。不要填寫任何包名。單擊<完成>。
HikariCPManager.java
我們建立了一個 HikariConfig() 例項並設定了 JDBC url、使用者名稱和密碼。最大池大小設定為 10。getPooledConnection() 方法用於獲取資料庫連線。
import java.sql.Connection; import java.sql.SQLException; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; public class HikariCPManager { public static HikariDataSource dataSource; public static HikariConfig config = null; // Set properties in constructor HikariCPManager(){ config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql:///TUTORIALSPOINT"); config.setUsername("root"); config.setPassword("guest123"); // Set maximum connection pool size config.setMaximumPoolSize(10); dataSource = new HikariDataSource(config); } public static Connection getPooledConnection() throws SQLException { return dataSource.getConnection(); } public static void close () { if (dataSource != null) { dataSource.close(); } } }
TestPooledConnection.java
在這個例子中,我們建立了 HikariCPManager 例項,並使用 getPooledConnection() 準備了一個池化連線。一旦連線物件準備就緒,我們就使用 SELECT 查詢準備了一個 PreparedStatement 例項。使用 executeQuery() 執行查詢,並透過迭代接收到的 resultSet 列印所有員工。
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestPooledConnection { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { HikariCPManager hcpm = new HikariCPManager(); conn = hcpm.getPooledConnection(); if (conn != null) { // Prepare statement String sql = "SELECT * FROM employees"; pstmt = conn.prepareStatement(sql); // Execute query rs = pstmt.executeQuery(); // Process and print results while (rs.next()) { int id = rs.getInt("id"); String fname = rs.getString("first"); String lname = rs.getString("last"); System.out.println("ID: " + id + ", First Name: " + fname + ", Last Name: " + lname); } } else { System.out.println("Error getting connection."); } } catch (SQLException e) { e.printStackTrace(); } finally { // Close all resources try { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } // Close connection pool HikariCPManager.close(); } }
輸出
在 Eclipse 中,在包資源管理器上,右鍵單擊 TestPooledConnection.java,轉到以 Java 應用程式方式執行 -> 執行。在控制檯上,您將看到 -
ID: 1, First Name: Shahbaz, Last Name: Ali ID: 2, First Name: Mahnaz, Last Name: Fatma ID: 4, First Name: Sumit, Last Name: Mittal ID: 21, First Name: Jeevan, Last Name: Rao ID: 22, First Name: Dinesh, Last Name: Kumar ID: 25, First Name: Jeevan, Last Name: Rao ID: 26, First Name: Aditya, Last Name: Chaube ID: 34, First Name: Ahmed, Last Name: Ali ID: 35, First Name: Raksha, Last Name: Agarwal