ConnectionManager.java package xupt.se.util;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ResourceBundle;import com.mchange.v2.c3p0.ComboPooledDataSource;import
package xupt.se.util; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ResourceBundle; import com.mchange.v2.c3p0.ComboPooledDataSource; import com.mchange.v2.c3p0.DataSources; import com.alibaba.druid.pool.DruidDataSource; /** * 数据库连接操作类 * @author 张荣 */ public final class ConnectionManager { private static ConnectionManager instance; private static ComboPooledDataSource ds; private static DruidDataSource dds; //Druid初始化 static { ResourceBundle rb = ResourceBundle.getBundle("druid"); dds = new DruidDataSource(); try { dds.setDriverClassName(rb.getString("driver")); }catch (Exception e){ e.printStackTrace(); } dds.setUrl(rb.getString("url")); dds.setUsername(rb.getString("username")); dds.setPassword(rb.getString("password")); dds.setInitialSize(5); dds.setMinIdle(1); dds.setMaxActive(10); } // 初始化,只执行一次 static { ResourceBundle rb = ResourceBundle.getBundle("c3p0"); ds = new ComboPooledDataSource(); try { ds.setDriverClass(rb.getString("driver")); } catch(Exception e) { e.printStackTrace(); } ds.setJdbcUrl(rb.getString("url")); ds.setUser(rb.getString("username")); ds.setPassword(rb.getString("password")); } /** * 获取数据库实例 * @return 连接对象ConnectionManager */ public synchronized static final ConnectionManager getInstance() { if(instance == null) { try { instance = new ConnectionManager(); } catch(Exception e) { e.printStackTrace(); } } return instance; } /** * 获取数据库连接 * @return 数据库连接对象Connection */ public synchronized final Connection getDruidConnection(){ try { // 查看活动链接数 // System.out.println("------->busy connections: " + ds.getNumBusyConnections()); return dds.getConnection(); } catch(SQLException e) { e.printStackTrace(); } return null; } /** * 获取数据库连接 * @return 数据库连接对象Connection */ public synchronized final Connection getConnection() { try { // 查看活动链接数 // System.out.println("------->busy connections: " + ds.getNumBusyConnections()); return ds.getConnection(); } catch(SQLException e) { e.printStackTrace(); } return null; } /** * 关闭数据库连接 * @return void */ public static void close(ResultSet rs, Statement stmt, Connection con) { try { if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(con != null) con.close(); } catch(SQLException e) { e.printStackTrace(); } } /** * 释放数据库资源 * @return void */ @Override protected void finalize() throws Throwable { // 关闭datasource DataSources.destroy(ds); DataSources.destroy(dds); super.finalize(); } }TestEmployeeDAO.java
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import xupt.se.util.ConnectionManager; public class TestEmployeeDAO extends Thread { // 为什么定义成静态的? private static ConnectionManager manager = ConnectionManager.getInstance(); public void runDruidPool(){ try { Connection con = null; Statement stmt = null; ResultSet rs = null; int count = 0; try { con = manager.getDruidConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("SELECT count(*) FROM employee"); if(rs.next()) count = rs.getInt(1); } finally { ConnectionManager.close(rs, stmt, con); } } catch(Exception e) { e.printStackTrace(); } } // 使用连接池 public void run() { try { Connection con = null; Statement stmt = null; ResultSet rs = null; int count = 0; try { con = manager.getConnection(); stmt = con.createStatement(); rs = stmt.executeQuery("SELECT count(*) FROM employee"); if(rs.next()) count = rs.getInt(1); } finally { ConnectionManager.close(rs, stmt, con); } } catch(Exception e) { e.printStackTrace(); } } // 未使用连接池 public void runNoPool(int i) { String dbUrl = "jdbc:mysql://localhost:3306/ttms?useUnicode=true&characterEncoding=utf-8&useSSL=false"; try { Connection con = DriverManager.getConnection(dbUrl, "root", "198498"); Class.forName("com.mysql.jdbc.Driver"); Statement stmt = null; ResultSet rs = null; int count = 0; stmt = con.createStatement(); rs = stmt.executeQuery("SELECT count(*) FROM employee"); if(rs.next()) count = rs.getInt(1); rs.close(); stmt.close(); con.close(); } catch(Exception e) { e.printStackTrace(); } } // 对使用线程池和不使用的比较 private void compare() { long start, end; // -----------使用连接池----------- start = System.currentTimeMillis(); TestEmployeeDAO[] test = new TestEmployeeDAO[1000]; try { for(int i = 0; i < test.length; i++) { test[i] = new TestEmployeeDAO(); test[i].start(); test[i].join(); } } catch(InterruptedException e) { e.printStackTrace(); } end = System.currentTimeMillis(); System.out.println("使用连接池总用时= " + (end - start) + " ms"); // -----------使用Druid连接池----------- start = System.currentTimeMillis(); TestEmployeeDAO[] test1 = new TestEmployeeDAO[1000]; try { for(int i = 0; i < test.length; i++) { test1[i] = new TestEmployeeDAO(); test1[i].runDruidPool(); } } catch(Exception e) { e.printStackTrace(); } end = System.currentTimeMillis(); System.out.println("使用Druid连接池总用时= " + (end - start) + " ms"); // // // -----------不使用连接池----------- // start = System.currentTimeMillis(); // TestEmployeeDAO[] test2 = new TestEmployeeDAO[1000]; // for(int i = 0; i < test2.length; i++) // { // test2[i] = new TestEmployeeDAO(); // test2[i].runNoPool(i); // } // end = System.currentTimeMillis(); // System.out.println("不使用连接池总用时= " + (end - start) + " ms"); // // System.out.println("over"); } public static void main(String[] args) { // 测试速度 TestEmployeeDAO test = new TestEmployeeDAO(); test.compare(); // 正常使用DAO // EmployeeDAO dao = (EmployeeDAO) DAOFactory.creatEmployeeDAO(); // ArrayListdruid.propertieslist = dao.findEmployeeAll(); // for(Employee e : list) // { // System.out.println(e.getEmp_name() + " : " + e.getEmp_addr()); // } } }
#DB login parameters driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ttms?useUnicode=true&characterEncoding=utf-8&useSSL=true username=root password=198498 #druid配置 filters=stat maxActive=20 initialSize=1 maxWait=60000 minIdle=10 maxIdle=15 timeBetweenEvictionRunsMillis=60000 minEvictableIdleTimeMillis=300000 validationQuery=SELECT 'x' testWhileIdle=true testOnBorrow=false testOnReturn=false maxOpenPreparedStatements=20 removeAbandoned=true removeAbandonedTimeout=1800 logAbandoned=true