DBCP连接池
- DBCP(DataBase Connection Pool)属于Apache顶级项目Commons中的核心子项目(最早在Jakarta Commons里就有),在Apache的生态圈中的影响里十分广泛,比如最为大家所熟知的Tomcat就在内部集成了DBCP,实现JPA规范的OpenJPA,也是默认集成DBCP的。但DBCP并不是独立实现连接池功能的,它内部依赖于Commons中的另一个子项目Pool,连接池最核心的“池”,就是由Pool组件提供的,因此,DBCP的性能实际上就是Pool的性能,DBCP和Pool的依赖关系如下表:
Apache Commons DBCP | Apache Commons Pool |
---|---|
v1.2.2 | v1.3 |
v1.3 | v1.5.4 |
v1.4 | v1.5.4 |
v2.0.x | v2.2 |
v2.1.x | v2.4.2 |
v2.2.x | v2.5.0 |
- 可以看到,因为核心功能依赖于Pool,所以DBCP本身只能做小版本的更新,真正大版本的更迭则完全依托于pool。有很长一段时间,pool都还是停留在1.x版本,这直接导致DBCP也更新乏力。很多依赖DBCP的应用在遇到性能瓶颈之后,别无选择,只能将其替换掉,DBCP忠实的拥趸tomcat就在其tomcat 7.0版本中,自己重新设计开发出了一套连接池(Tomcat JDBC Pool)。好在,在2013年事情终于迎来转机,13年9月Commons-Pool 2.0版本发布,14年2月份,DBCP也终于迎来了自己的2.0版本,基于新的线程模型全新设计的“池”让DBCP重焕青春,虽然和新一代的连接池相比仍有一定差距,但差距并不大,DBCP2.x版本已经稳稳达到了和新一代产品同级别的性能指标(见下图)。
- DBCP终于靠Pool咸鱼翻身,打了一个漂亮的翻身仗,但长时间的等待已经完全消磨了用户的耐心,与新一代的产品项目相比,DBCP没有任何优势,试问,谁会在有选择的前提下,去选择那个并不优秀的呢?也许,现在还选择DBCP2的唯一理由,就是情怀吧。
- 单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去
DBCP连接池的使用
导入相应jar包
- (1)commons-dbcp.jar
- (2)commons-pool.jar
- (3)commons-logging.jar 日志支持(可选)
- (4)mysql驱动包
- 硬编码使用DBCP
- 所谓的硬编码方式就是在代码中添加配置
- 代码示例:
public class DBCPUtil { private static BasicDataSource dataSource; static{ try { //设置四个基本属性 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/myschool?useSSL=true&characterEncoding=utf8"); dataSource.setUsername("root"); dataSource.setPassword("root"); //其他属性 //设置初始大小 dataSource.setInitialSize(20); //设置最大个数 dataSource.setMaxTotal(50); //设置最大空闲连接 dataSource.setMaxIdle(10); //设置最小空闲连接 dataSource.setMinIdle(5); //设置超时时间 dataSource.setMaxWaitMillis(5000); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } public static int executeUpdate(String sql,Object...params){ Connection conn = null; PreparedStatement pstat = null; try { conn = getConnection(); pstat = conn.prepareStatement(sql); if(params!=null){ for (int i = 0; i <params.length ; i++) { pstat.setObject(i+1,params[i]); } } return pstat.executeUpdate(); }catch (Exception e){ e.printStackTrace(); }finally { } return -1; } }
- 软编码使用DBCP
- 所谓的软编码,就是在项目中添加配置文件,这样就不需要每次代码中添加配合!
- 项目中添加配置:
- 文件名称: dbcp.properties
- 文件位置: /src/resource下
- DBCP.properties代码示例:
#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/school username=root password=root #<!-- 初始化连接 --> initialSize=10 #最大连接数量 maxTotal=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWaitMillis=5000
- 软编码只需要把上面static静态内部类里面的代码修改一下即可:
static{ try { Properties properties = new Properties(); InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties"); properties.load(is); is.close(); //使用抽象工厂创建连接 dataSource = BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } }