JDBC - 連線池



對於流量很大的網站,獲取資料庫連線的資源可能非常昂貴。此外,想象一下,一個網站有 500 個併發使用者,每個使用者都試圖獲取一個連線來選擇或更新資料。在這種情況下,為了防止多個使用者破壞資料,資料庫會使用鎖。當一個使用者對一個表進行選擇操作時,該表會被鎖定。除非釋放鎖,否則其他使用者無法獲取該表。讓 500 個使用者等待連線是不可接受的。

Java 中的連線池是一種用於提高資料庫驅動應用程式效能的技術。與其每次應用程式需要與資料庫互動時都建立一個新的連線,不如建立一個連線池,並由連線池管理器進行管理。這消除了每次建立新連線的開銷,從而導致更快的響應時間和更好的資源利用率。

連線池的優點

以下是連線池的優點。

  • 效能提升 - 連線池減少了建立和關閉連線的開銷,從而使應用程式的響應時間更快。

  • 資源最佳化 - 透過重用連線,連線池有助於節省系統資源,例如記憶體和網路連線。

  • 可擴充套件性 - 連線池可以根據需求動態增長或縮小,允許您的應用程式處理不同的工作負載。

流行的連線池庫

以下是流行的連線池庫。

  • HikariCP - 以其效能和效率而聞名。

  • Apache Commons DBCP - 使用廣泛且久負盛名。

  • c3p0 - 另一個流行的選擇,專注於穩定性。

示例:使用 HikariCP 的連線池

我們將使用 HikariCP 連線池庫。在 Eclipse 中,轉到檔案 -> 新建 -> Java 專案

將專案的名稱設定為HikariCPExample。單擊完成。現在在專案資源管理器中,右鍵單擊專案名稱,選擇構建路徑 -> 新增外部存檔。新增以下 3 個 jar 包

  1. HikariCP-5.0.1.jar - 從 HikariCP-5.0.1.jar 下載

  2. mysql-connector-j-8.4.0.jar - 從 mysql-connector-j-8.4.0.jar 下載

  3. 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
廣告