一、介绍
1、连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用
2、作用
连接对象创建和销毁是需要耗费时间的,在服务器初始化的时候就初始化一些连接。把这些连接放入到内存中,使用的时候可以从内存中获取,使用完成之后将连接放入连接池中。从内存中获取和归还的效率要远远高于创建和销毁的效率,提升性能。
二、常见的开源连接池
- druid
Druid阿里旗下开源连接池产品
-
C3P0
C3P0是一个开放源代码的JDBC连接池,Hibernate的发行包中默认使用此连接池。据说性能最好。
三、DBUtils
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能
四、druid的使用
1、添加maven
<dependency> <groupId>com.alibabagroupId> <artifactId>druidartifactId> <version>1.1.23version>dependency>
2、db.properties放在src目录下
#key=valuedriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mydb?rewriteBatchedStatements=true#url=jdbc:mysql://localhost:3306/mysqldbusername=rootpassword=rootinitialSize=10minIdle=5maxActive=20maxWait=5000
3、代码
@Test /** * Druid的使用: * * 配置方式设置参数 * Druid配置方式可以使用属性文件配置的。 * * 文件名称没有规定但是属性文件中的key要一定的。 */ public void druid(){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ // 使用连接池: // 从属性文件中获取: Properties properties = new Properties(); properties.load(new FileInputStream("src/druid.properties")); DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); // 获得连接: conn = dataSource.getConnection(); // 编写SQL: String sql = "select * from account"; // 预编译SQL: pstmt = conn.prepareStatement(sql); // 设置参数: // 执行SQL: rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money")); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtil.release(rs, pstmt, conn); } }
五、c3P0
1、maven
<dependency> <groupId>c3p0groupId> <artifactId>c3p0artifactId> <version>0.9.1.2version>dependency>
2、c3p0-config.xml配置文件,eclipse放在src目录下,idea放在resource目录下
<?xml version="1.0" encoding="UTF-8"?> ="driverClass">com.mysql.jdbc.Driver ="jdbcUrl">jdbc:mysql:///mydb ="user">root ="password">root ="initialPoolSize">5 ="minPoolSize">5 ="maxPoolSize">20
3、代码
@Test/** * 采用配置文件的方式: */public void c3p0(){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ // 获得连接:从连接池中获取: // 创建连接池://创建连接池默认去类路径下查找c3p0-config.xml ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 从连接池中获得连接: conn = dataSource.getConnection(); // 编写SQL: String sql = "select * from account"; // 预编译SQL: pstmt = conn.prepareStatement(sql); // 执行SQL: rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money")); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtil.release(rs, pstmt, conn); }}
六、c3p0连接池工具类
1、代码
/** * JDBC的工具类 * @author jt * */public class JDBCUtils2 { // 创建一个连接池:但是这个连接池只需要创建一次即可。 private static final ComboPooledDataSource dataSource = new ComboPooledDataSource(); /** * 获得连接的方法 * @throws SQLException */ public static Connection getConnection() throws SQLException{ return dataSource.getConnection(); } /** * 获得连接池: */ public static DataSource getDataSource(){ return dataSource; } /** * 释放资源的方法 */ public static void release(Statement stmt,Connection conn){ if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } public static void release(ResultSet rs,Statement stmt,Connection conn){ // 资源释放: if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } if(stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } }}