数据库连接池BoneCP源码分析报告
不错,弄上来一起学习。
数据库连接池BONECP源码分析报告 1
1. 简述 2
1.1 官方主页 2
1.2 API文档 2
1.3 BoneCP简介(译自官方) 2
1.4 BoneCP特点(译自官方) 2
1.5 本次分析使用的版本 3
1.6 依赖库 3
1.7 包结构说明 3
1.8 主要类型 3
1.9 连接池创建过程及连接获取过程简述 4
2. BONECP生命周期过程 4
2.1 BoneCPConfig初始化及配置分析 4
2.2 BoneCPDataSource分析 5
2.3 BoneCP初始化过程分析 5
2.4 BoneCP的getConnection()过程分析 6
2.5 BoneCP的shutdown 6
3. BONECP使用的队列数据结构分析 7
3.1 LIFOQueue 7
3.2 LinkedBlockingDeque(JDK1.6) 7
3.3 BoundedLinkedTransferQueue 8
3.4 LinkedTransferQueue(将纳入JDK1.7) 8
4.BONECP线程池 10
5.发现BONECP-0.7.0中的BUG 12
数据库连接池BoneCP源码分析报告
作者:葛一帆 时间:2011-03-13
1. 简述
1.1 官方主页
http://jolbox.com/
1.2 API文档
http://jolbox.com/bonecp/downloads/site/apidocs/index.html
1.3 BoneCP简介(译自官方)
BoneCP是一个快速,免费,开源的Java数据库连接池(即,JDBC Pool)。如果熟悉C3P0或者DBCP,那么你也就知道它是用来干什么的。简单地说,这个代码库将为你管理数据库连接,让你的应用具有更快的数据库访问能力。
1.4 BoneCP特点(译自官方)
? 具有高可扩展性的快速连接池
? 在connection状态改变时,可配置回调机制(钩式拦截器)
? 通过分区(Partitioning)来提升性能
? 允许你直接访问connection或statement
? 自动地扩展pool容量
? 支持statement caching
? 支持异步地获取connection(通过返回一个Future<Connection>)
? 以异步的方式,施放辅助线程(helper threads)来关闭connection和statement,以获得高性能。
? 在每个新获取的connection上,通过简单的机制,执行自定义的statement,(即通过简单的SQL语句来测试connection是否有效,对应的配置属性为initSQL)
? 支持运行时切换数据库,而不需要停止(shut down)应用
? 能够自动地回放(replay)任何失败的事务(例如,数据库或网络出现故障等等)
? 支持JMX
? 可以延迟初始化(lazy initialization)
? 支持使用XML或property文件的配置方式
? 支持idle connection timeouts和max connection age
? 自动检验connection(是否活跃等等)
? 允许直接从数据库获取连接,而不通过Driver
? 支持Datasouce和Hibernate
? 支持通过debugging hooks来定位获取后未关闭的connection
? 支持通过debugging来显示被关闭了两次的connection的堆栈轨迹(stack locations)
? 支持自定义pool name
? 整洁有序的代码
? 免费,开源,纯Java编写,具有完整的文档。
1.5 本次分析使用的版本
bonecp-0.7.0.jar
1.6 依赖库
slf4j-api-1.5.8.jar
slf4j-nop-1.5.8.jar
guava-r08.jar (google lib)
1.7 包结构说明
主要包
com.jolbox.bonecp 连接池核心包
com.jolbox.bonecp.hooks 支持connection状态改变时的事件通知
com.jolbox.bonecp.proxy 代理java.sql.*下的接口,仅供内部使用
jsr166y 将jsr166y的部分类型直接打包进来
其它包,提供外部支持和测试
com.jolbox.bonecp.provider
com.jolbox.bonecp.spring
com.jolbox.benchmark
1.8 主要类型
com.jolbox.bonecp.BoneCP
com.jolbox.bonecp.BoneCPConfig
com.jolbox.bonecp.BoneCPDataSource
com.jolbox.bonecp包下的多种线程及包装类
1.9 连接池创建过程及连接获取过程简述
代码:
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//实例化配置类
BoneCPConfig config = new BoneCPConfig();
//设置配置
config.setJdbcUrl("jdbc:mysql://localhost:3306/sailing_db");
config.setUsername("root");
config.setPassword("root");
config.setXxx…
//创建连接池
BoneCP pool = new BoneCP(config);
//从池中获取连接
Connection connection = pool.getConnection();
System.out.println(connection.getClass().getName());
System.out.println("--->"+connection.getAutoCommit());
connection.close();
pool.shutdown();
注:以上是使用BoneCP的基本方式,其它方式,比如数据源支持,读取配置文件等,都是对该过程的进一步封装,以“适配”不同的使用需求。下面开始进行源码分析,对该连接池的运行过程进行详细的阐述。
2. BoneCP生命周期过程
2.1 BoneCPConfig初始化及配置分析
BoneCPConfig提供了以XML和Properties两种配置方式。它的无参构造方法将会加载类路径下的XML配置文件,然后调用JDK的XML解析库对XML进行解析(即javax.xml..下)。XML文件中的配置信息最终会被转化成java.util.Properties对象,然后调用设置setProperties的方法进行属性设置。setProperties方法接收Properties对象作为参数,并借助Java反射机制,用一次for循环将属性注入到字段中。BoneCPConfig将属性字段的类型限定为4种,分别为:int, long, boolean和String。
除了常规的连接池设置,配置属性中需要特别说明字段如下:
connectionHook
initSQL
2.2&nbs