資料庫連線池之DB2
阿新 • • 發佈:2018-11-09
最近專案開發遇到一個問題,當資料量過大時會導致系統崩潰,經過排查,發現是每一次操作資料庫都建立一次資料連線,當資料量太大,就會導致程式無法負載從而宕機。
而後進行程式碼改造,改用資料庫連線池。目前使用資料庫連線池有兩種方式,使用配置檔案以及不使用配置檔案!
第一種: 不使用配置檔案
先決條件: 匯入c3p0.jar包
程式碼如下:
package com.wk.cl.jxnx.esb.util; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.wk.cl.common.util.CfgTool; import java.beans.PropertyVetoException; import java.sql.*; /** * @title 資料庫操作 * @description 資料庫操作 * @since Java5 */ public class JDBCUtil { public static String driver = CfgTool.getProjectPropterty("esb.db.jdbc.driver"); public static String url = CfgTool.getProjectPropterty("esb.db.jdbc.url"); public static String user = CfgTool.getProjectPropterty("esb.db.jdbc.user"); public static String password = CfgTool.getProjectPropterty("jxnx.esb.db.jdbc.password"); private static JDBCUtil dbPoll; private ComboPooledDataSource dbSource; //靜態程式碼塊,一開始我們就執行建構函式載入配置資訊 static { dbPoll = new JDBCUtil(); } private JDBCUtil() { try{ dbSource = new ComboPooledDataSource(); dbSource.setUser(user); dbSource.setPassword(password); dbSource.setJdbcUrl(url); dbSource.setDriverClass(driver); dbSource.setInitialPoolSize(1); dbSource.setMinPoolSize(2); dbSource.setMaxPoolSize(10); dbSource.setMaxStatements(50); dbSource.setMaxIdleTime(60); }catch (PropertyVetoException e){ throw new RuntimeException(e); } } //獲取例項 public final static JDBCUtil getInstance(){ return dbPoll; } /** * 獲取資料庫連線 * @param url url * @param user 使用者名稱 * @param password 密碼 * @return 資料庫連線 * @throws SQLException */ public final Connection getConnection(String url, String user, String password) throws SQLException {
//不使用連線池連線方式 // try { // Class.forName(driver); // } catch (ClassNotFoundException e) { // logger.error("JDBC 驅動載入異常 :[{}]",e.getMessage()); // } // return DriverManager.getConnection(url, user, password); try{ return dbSource.getConnection(); }catch (SQLException e){ throw new RuntimeException("無法獲取連線", e); } } /** * 釋放資料庫相關物件 * * @param rs 結果集 * @param pstmt 宣告 * @param conn 連線 */ public static void free(ResultSet rs, PreparedStatement pstmt, Connection conn) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { try { if (!conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } } }
第二種: 使用properties檔案
新建一個配置檔案:c3p0.properties (注意:名字是固定的。c3p0預設只認識這個名字),具體配置如下:
c3p0.driverClass=com.ibm.db2.jcc.DB2Driver c3p0.jdbcUrl=jdbc:db2://10.1.1.232:50000/cltest c3p0.user=db2inst1 c3p0.password=db2inst1
接下來新建C3P0Demo類
/** * Title: C3P0Demo.java * File Description: * @copyright: 2018 * @company: CORSWORK * @author: guojw * @version: 1.0 * @date: 2018年11月9日 */ package com.wk.cl.jxnx.esb.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; /** * Class Description: * @author guojw * 2018年11月9日 */ public class C3P0Demo { public void getConByC3P0() throws SQLException { DataSource ds = new ComboPooledDataSource();//c3p0自己去讀配置檔案了,我們啥也不幹 Connection conn = ds.getConnection(); //執行緒池建立連線 System.out.println("conn:"+conn); String sql = "SELECTS * FROM SERV_AUTHORIZATION"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getString(1)); System.out.println(rs.getString(2)); System.out.println(rs.getString(3)); } //關閉連線 rs.close(); pstmt.close(); conn.close();// 連線還給連線池,而不是關閉連線 } }