commons-dbcp 連接池使用
dbcp 是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar。
下面是個dbcp的實用類,通過它可以完成DBCP的使用:
package dbcp;import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; /**
- @author space
- @date Aug 12, 2008 3:25:49 PM *
- dbcp 實用類,提供了dbcp連接,不允許繼承;
- 該類需要有個地方來初始化 DS ,通過調用initDS 方法來完成,
- 可以在通過調用帶參數的構造函數完成調用,
可以在其它類中調用,也可以在本類中加一個static{}來完成; / public final class DbcpBean { /** 數據源,static / private static DataSource DS; /* 從數據源獲得一個連接 / public Connection getConn() { Connection con = null; if (Ds!= null) { try { con = Ds.getConnection(); } catch (Exception e) { e.printStackTrace(System.err); }
try { con.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } return con; } return con; } / 默認的構造函數 */ public DbcpBean() { } / 構造函數,初始化了 DS ,指定 數據庫 / public DbcpBean(String connectURI) { initDS(connectURI); } /** 構造函數,初始化了 DS ,指定 所有參數 / public DbcpBean(String connectURI, String username, String pswd, String driverClass, int initialSize, int maxActive, int maxIdle, int maxWait) { initDS(connectURI, username, pswd, driverClass, initialSize, maxActive, maxIdle, maxWait); } /**
- 創建數據源,除了數據庫外,都使用硬編碼默認參數;
- @param connectURI 數據庫
- @return */ public static void initDS(String connectURI) { initDS(connectURI, "root", "password", "com.mysql.jdbc.Driver", 5, 100, 30, 10000); } /**
- 指定所有參數連接數據源
- @param connectURI 數據庫
- @param username 用戶名
- @param pswd 密碼
- @param driverClass 數據庫連接驅動名
- @param initialSize 初始連接池連接個數
- @param maxActive 最大激活連接數
- @param maxIdle 最大閑置連接數
- @param maxWait 獲得連接的最大等待毫秒數
- @return / public static void initDS(String connectURI, String username, String pswd, String driverClass, int initialSize, int maxActive, int maxIdle, int maxWait) { BasicDataSource ds = new BasicDataSource(); ds.setDriverClassName(driverClass); ds.setUsername(username); ds.setPassword(pswd); ds.setUrl(connectURI); ds.setInitialSize(initialSize); // 初始的連接數; ds.setMaxActive(maxActive); ds.setMaxIdle(maxIdle); ds.setMaxWait(maxWait); DS = ds; } /** 獲得數據源連接狀態 / public static Map<String, Integer> getDataSourceStats() throws SQLException { BasicDataSource bds = (BasicDataSource) DS; Map<String, Integer> map = new HashMap<String, Integer>(2); map.put("active_number", bds.getNumActive()); map.put("idle_number", bds.getNumIdle()); return map; } /* 關閉數據源 / protected static void shutdownDataSource() throws SQLException { BasicDataSource bds = (BasicDataSource) DS; bds.close(); } public static void main(String[] args) { DbcpBean db = new DbcpBean("jdbc:<a href="mysql://localhost:3306/testit">mysql://localhost:3306/testit"); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = db.getConn(); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from test limit 1 "); System.out.println("Results:"); int numcols = rs.getMetaData().getColumnCount(); while (rs.next()) { for (int i = 1; i <= numcols; i++) { System.out.print("\t" + rs.getString(i) + "\t"); } System.out.println(""); } System.out.println(getDataSourceStats()); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); if (db != null) shutdownDataSource(); } catch (Exception e) { e.printStackTrace(); } } } }
</pre>