为什么要学习BoneCP
java连接池发展了这么久,基本上已经都很稳定了,你看 C3P0 和 DBCP 都不再发布新版本了。而 BoneCP出彩的地方就是跟进了技术的最新进展。研究它的源码,发现有两个主要原因:
1. BoneCP 不用 synchronized 关键字来处理多线程对资源的争用,而是使用 java.util.concurrent 包中的锁机制,这个包是在 JDK 1.5 才开始有的
2. 分区机制,尽管使用了锁,但还是存在着资源争用的问题,因此 BoneCP 可配置多个连接池分区,每个分区独立管理,互不影响。尽管连接池的性能并不会是一个系统中的瓶颈,但是我们单纯从连接池这个角度来看 BoneCP ,也是值得我们去学习的。
特性
1.高度可扩展, 快速的连接池. 注:1)不用synchronized 关键字来处理多线程对资源的争用,而是使用 java.util.concurrent 包中的锁机制;2)首次使用分区机制来分开管理数据库连接;或许还有其他原因.
2.回调(钩子拦截器)机制在连接状态的改变上。
3利用分区技术提高性能
4.允许直接访问一个连接或者语句
5.智能调整连接池大小
6.SQL语句缓存支持
7.支持异步获取数据库连接 (通过返回Future<Connection>的形式)
8.通过释放连接助理进程来释放数据库连接,提高性能.
9.通过initSQL参数在每次获取连接的时候执行SQL
10.支持数据库热切换
11.自动重试失败的数据库操作(当数据库或者网络挂掉的时候)
12.JMX support
13.延迟初始化能力(Lazy initialization capable)
14.自动检测连接可用性 (keep-alives 等)
15.允许直接通过数据源而不是通过驱动来获取一个新的数据库连接(Allow obtaining of new connections via a datasource rather than via a Driver)
16.Datasource/Hibernate support capable
17.Debug支持准确地高亮那些已经得到但是还没有关闭的链接(Debugging hooks to highlight the exact place where a connection was obtained but not closed)
18.Debug支持展示那些被关闭两次的链接地址堆栈信息(Debugging support to show stack locations of connections that were closed twice. )
19.支持自定义连接池名称.
20.干净的代码结构,TestCase代码覆盖率达到100% (over 125 JUnit tests).
21.免费的,开源的而且都是用java干的,最重要的是有很完整的javadocs支持。(Free, open source and written in 100% pure Java with complete Javadocs).
使用bonecp
pom.xml
<!-- bonecp 数据源 -->
<dependency>
<groupId>com.jolbox</groupId>
<artifactId>bonecp</artifactId>
<version>0.7.1.RELEASE</version>
</dependency>
application.xml
<!--用于连接boneCp数据源 -->
<bean id="commonDataSourceConfig" class="com.jolbox.bonecp.BoneCPDataSource" abstract="true" destroy-method="close">
<!-- 每个分区最大的连接数 -->
<property name="maxConnectionsPerPartition" value="100" />
<!-- 每个分区最小的连接数 -->
<property name="minConnectionsPerPartition" value="10" />
<!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定-->
<property name="partitionCount" value="3" />
<!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 -->
<property name="acquireIncrement" value="2" />
<!-- 测试连接有效性的间隔时间,单位分钟
<property name="idleConnectionTestPeriod" value="40" />-->
<!-- 空闲存活时间 分钟
<property name="idleMaxAge" value="10"/>-->
<!-- 连接超时时间 毫秒-->
<property name="connectionTimeoutInMs" value="10000"/>
</bean>
<!-- 数据源配置 -->
<bean id="dataSource" parent="commonDataSourceConfig">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>