如果您的應用側主要使用Java語言,且資料庫連接建立頻繁(例如短串連情境)或串連數量較大(大於MySQL資料庫的串連數限制),您可以使用Java串連池Druid串連資料庫,降低串連建立頻率以減少資料庫主線程的開銷。
前提條件
應用伺服器已安裝Java環境且JDK版本在1.8及以上。
已將伺服器IP地址添加至RDS執行個體白名單中,詳情請參見設定IP白名單。
若您的應用程式部署在阿里雲ECS伺服器上,且ECS與RDS已實現內網互連(ECS與RDS執行個體的地區、VPC均相同),則無需設定IP白名單。
準備工作
本文以Maven專案為例,介紹使用Druid串連池串連資料庫前的準備工作。
Maven是一個Java專案管理工具,其為開發人員提供了一套標準化的Java專案構建流程與依賴管理機制。使用Maven建立的Java專案帶有標準化的目錄結構,其中pom.xml
為專案描述檔案,src/main/java
目錄存放專案的Java原始碼,src/main/resources
目錄存放專案資源檔。
安裝Druid:您需要在
pom.xml
檔案的dependencies
中添加以下依賴項安裝Druid,Druid串連池版本建議選擇1.2.13及以上。<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.19</version> </dependency>
通過
druid-spring-boot-starter
使用串連池Druid時,為了簡化依賴關係,便於後續Druid版本的更新維護,您需要在pom.xml
檔案的dependencies
中先排除其依賴的Druid組件,再顯式依賴Druid組件,如下所示。<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.19</version> <exclusions> <exclusion> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.19</version> </dependency>
使用Druid串連資料庫
配置串連池參數:您需要在專案的
src/main/resources
目錄中建立druid.properties
檔案,並在檔案中添加以下內容為串連池配置相關參數,參數說明詳情請參見Druid串連池常見參數配置。RDS MySQL資料庫連接地址和連接埠的擷取方法,請參見查看和管理執行個體串連地址和連接埠。
# 驅動類名,無需替換 driverClassName=com.mysql.jdbc.Driver # url、username、password、database需要替換為業務實際的內容 url=jdbc:mysql://rm-bp**************.mysql.rds.aliyuncs.com:3306/database username=**** password=**** # 初始化時建立的串連數 initialSize=20 # 最小空閑串連數 minIdle=20 # 串連池最大串連數 maxActive=100 # 一條物理串連的存活時間 phyTimeoutMillis=3600000 # 擷取串連最大等待時間,如果串連池中沒有可用串連且已達到最大串連數,則應用擷取串連的請求將被阻塞,最多等待maxWait(毫秒),建議保持不變 maxWait=5000 # 連線逾時時間,表示資料庫驅動和資料庫伺服器之間建立TCP串連的逾時時間,單位毫秒 connectTimeout=20000 # Socket逾時時間,表示通過TCP串連發送資料(執行的sql)後,等待響應的逾時時間,單位毫秒 socketTimeout=60000 # 串連驗證配置項,建議保持不變 testWhileIdle=true testOnBorrow=false testOnReturn=false # PreparedStatement緩衝配置項,此處配置為true表示開啟緩衝,建議保持不變 poolPreparedStatements=true maxPoolPreparedStatementPerConnectionSize=100
使用串連池訪問資料庫:您需要在
src/main/java
目錄存放的原始碼檔案中匯入相關依賴,構建DruidPoolDemo
類,通過串連池Druid擷取JDBC的串連資訊並訪問MySQL資料庫。// 匯入相關依賴 package com.aliyun.rdsfinops.collector.impl; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class DruidPoolDemo { private static DataSource dataSource = null; String tableName = "sql_table_test"; // 載入參數 static { Properties properties = new Properties(); // 擷取串連池配置 InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties"); try { properties.load(inputStream); // 初始化串連池 dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } /* 後續資料庫操作(見後文) 建立表: public void createTable() 插入資料:public void insertData() 查詢資料:public void selectData() 刪除資料:public void deleteData() */ }
串連池常見參數配置
在使用Druid串連資料庫時,建議您根據下述內容為串連池設定合適的參數,使資料庫的運行更穩定高效。
為了最大程度地避免潛在的風險和不確定性,在將新的參數值用於生產環境前,建議您至少進行一輪完整的功能測試和效能測試,以確保系統穩定性和可靠性。
推薦您在使用Druid串連池時設定以下參數,降低資料庫運行風險。
參數名 | 含義 | 預設值 | 推薦值 | 說明 |
initialSize | 串連池初始化時建立的串連數。 | 0 | 20~80 |
|
minIdle | 最小空閑串連數。 | 0 | 20~80 |
|
maxActive | 串連池最大串連數。 | 8 | 100 |
|
phyTimeoutMillis | 一條物理串連的存活時間(毫秒)。 | -1 | 3600000~28800000 |
|
maxWait | 擷取串連時的最大等待時間(毫秒)。 | -1 | 5000 |
|
connectTimeout | 連線逾時的時間(毫秒)。 | 10000 | 3000 |
|
socketTimeout | socket的逾時時間(毫秒)。 | 10000 | 10000~60000 |
|
testWhileIdle | 是否開啟空閑串連的檢測。 | false | true | 建議設定為 |
使用Druid串連池時,您可以選擇性地配置以下參數,提升資料庫效能。
參數名 | 含義 | 預設值 | 推薦值 | 說明 |
poolPreparedStatements | 是否緩衝PreparedStatement對象。 | true | true |
|
maxPoolPreparedStatementPerConnectionSize | 每個串連緩衝PreparedStatement對象的最大數量。 | 10 | 100 |
|
對於以下常見的串連池參數,您可以選擇直接使用預設配置或根據自身需求調整參數。
參數名 | 含義 | 預設值 | 推薦值 | 說明 |
failFast | 用於控制在擷取串連出現錯誤時的行為。 | false | false |
|
timeBetweenEvictionRunsMillis | 檢測空閑串連的時間間隔(毫秒)。 | 60000 | 60000 |
|
後續資料庫操作
您可以在DruidPoolDemo
類中添加自訂函數,滿足對資料庫操作的需求,本文以建立資料表、插入資料、查詢資料、刪除資料為例。
String tableName = "sql_table_test";
public void createTable() throws SQLException {
// 建立表
try (Connection connection = dataSource.getConnection()) {
try (Statement statement = connection.createStatement()) {
String sql = "create table if not exists " + tableName + "(id VARCHAR(255), name VARCHAR(255), PRIMARY KEY (id))";
int ret = statement.executeUpdate(sql);
System.out.println(ret);
}
}
}
String tableName = "sql_table_test";
public void insertData(){
// 插入資料
try (Connection connection = dataSource.getConnection()) {
String sql = "insert into " + tableName + "(id,name) values(?,?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.setString(2, "bb");
int ret = ps.executeUpdate();
System.out.println(ret);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
String tableName = "sql_table_test";
public void selectData() throws SQLException {
// 查詢資料
try (Connection connection = dataSource.getConnection()) {
String sql = "select * from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
String id = rs.getString(1);
String name = rs.getString(2);
System.out.println("id=" + id);
System.out.println("name=" + name);
}
}
}
}
String tableName = "sql_table_test";
public void deleteData(){
// 刪除資料
try (Connection connection = dataSource.getConnection()) {
String sql = "delete from " + tableName + " where id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, "aa");
ps.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
相關文檔
Python串連池:使用Python串連池DBUtils串連資料庫
RDS MySQL資料庫代理中的串連池功能:RDS MySQL設定串連池