業務場景中頻繁需要批量執行 SQL,逐條執行網絡往返開銷大。JDBC 提供 addBatch() / executeBatch() 機制,Statement 與 PreparedStatement 均支持。
String sql1 = "DROP TABLE IF EXISTS people";
String sql2 = "CREATE TABLE people(id int, name varchar(20))";
String sql3 = "INSERT people VALUES(2, 'hdu')";
String sql4 = "UPDATE people SET id = 1";
Statement stmt = conn.createStatement();
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
stmt.addBatch(sql4);
stmt.executeBatch(); // 一次性提交
PreparedStatement pstmt = conn.prepareStatement(
"INSERT people VALUES(?, ?)");
for (int i = 1; i < 4; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "hdu" + i);
pstmt.addBatch();
}
pstmt.executeBatch();
優勢:預編譯 SQL、防注入、參數化設置更安全高效。
Connection 提供三大核心方法:
setAutoCommit(boolean) —— 關閉自動提交(false)開啟事務commit() —— 顯式提交事務rollback() —— 回滾事務,通常放在 catch 塊Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, pass);
conn.setAutoCommit(false); // 關鍵:關閉自動提交
PreparedStatement pstmt1 = conn.prepareStatement("INSERT ...");
PreparedStatement pstmt2 = conn.prepareStatement("INSERT ...");
// 設置參數...
pstmt1.executeUpdate();
pstmt2.executeUpdate();
conn.commit(); // 所有操作成功才提交
} catch (Exception e) {
if (conn != null) conn.rollback(); // 異常回滾
e.printStackTrace();
} finally {
// 關閉資源...
}
注意:若程序未執行 commit() 就結束,事務自動回滾。
頻繁創建/銷毀連接極其昂貴,連接池預創建連接對象,按需借用歸還,顯著提升吞吐量。
依賴三個 JAR:commons-dbcp2.jar、commons-pool2.jar、commons-logging.jar
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://192.168.1.150/test");
bds.setUsername("teamtalk");
bds.setPassword("123456");
// 池參數調優
bds.setInitialSize(5); // 初始連接數
bds.setMaxTotal(20); // 最大連接數
bds.setMaxIdle(10); // 最大空閒連接
DataSource ds = bds;
// 使用
Connection conn = ds.getConnection();
實現 DataSource 接口,支持 XML 配置文件(c3p0-config.xml 放在 classpath 根目錄)。
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://192.168.1.150/test</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">teamtalk</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">100</property>
<property name="maxStatements">200</property> // Statement 緩存
</default-config>
</c3p0-config>
ComboPooledDataSource cpds = new ComboPooledDataSource(); // 自動讀取默認配置
DataSource ds = cpds;
Connection conn = ds.getConnection();
也可通過 new ComboPooledDataSource("named-config-name") 加載具名配置。
| 參數 | 含義 | 建議值 |
|---|---|---|
| initialPoolSize | 初始連接數 | CPU 核心數 * 2 |
| maxPoolSize | 最大連接數 | 根據業務峰值壓測確定 |
| maxIdleTime | 空閒連接回收時間(秒) | 30-60 |
| maxStatements | Statement 緩存大小 | 啟用後可大幅提升預編譯性能 |
| checkoutTimeout | 獲取連接超時(毫秒) | 3000-5000 |
PreparedStatement.addBatch()DriverManager.getConnection()