什么是BoneCP

BoneCP 是一个快速、免费而且开源的java数据库连接池(JDBC Pool)管理工具库。如果你曾经使用过C3P0或者DBCP,那你肯定知道上面这句话的意思;如果你没用过这些,那简单的解释一下,它是一个能为你的应用管理数据库连接的工具。

官方网站:http://jolbox.com/

为什么要学习BoneCP

本着不重复发明轮子的原则,不应该在有了C3P0这种成熟的数据库连接池管理工具后再搞个新的出来,但是传说中BoneCP在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右。不相信?其实我也不怎么信,正找时间自己写测试类测试呢,你也可以去试试看, 在这里下载 (现在最新版本0.6.7.2,如果你有困难,下面会具体提到在项目中怎么配置)

好吧,先看一下官方给出的华丽数据:

1.    单线程(1,000,000获得及释放数据库连接请求,连接池大小20-50)

2.    多线程(500线程分别获取释放100个链接,连接池大小50-200)

3.    Prepared Statement (multi-threaded)(500个线程每个100次获得/释放,连接池大小20-500)

这里只应用了部分,还有其他比较多的测试数据,有兴趣就去这里 瞧瞧吧。个人还是建议自己写点代码测试一下,那样感受更深啊。

在介绍怎么使用之前,先来看看BoneCP的特性(Features ):

  • 高度可扩展, 快速的连接池.    注:1)不用synchronized 关键字来处理多线程对资源的争用,而是使用 java.util.concurrent 包中的锁机制;2)首次使用分区机制来分开管理数据库连接;或许还有其他原因.
  • Callback (hook interceptor) mechanisms on a change of connection state.
  • 利用分区技术提高性能
  • 允许直接访问一个连接或者语句
  • 智能调整连接池大小
  • SQL语句缓存支持
  • 支持异步获取数据库连接 (通过返回Future<Connection>的形式)
  • 通过释放连接助理进程来释放数据库连接,提高性能.
  • 通过initSQL参数在每次获取连接的时候执行SQL
  • 支持数据库热切换
  • 自动重试失败的数据库操作(当数据库或者网络挂掉的时候)
  • JMX support
  • 延迟初始化能力(Lazy initialization capable)
  • 自动检测连接可用性 (keep-alives 等)
  • 允许直接通过数据源而不是通过驱动来获取一个新的数据库连接(Allow obtaining of new connections via a datasource rather than via a Driver)
  • Datasource/Hibernate support capable
  • Debug支持准确地高亮那些已经得到但是还没有关闭的链接(Debugging hooks to highlight the exact place where a connection was obtained but not closed)
  • Debug支持展示那些被关闭两次的链接地址堆栈信息(Debugging support to show stack locations of connections that were closed twice. )
  • 支持自定义连接池名称.
  • 干净的代码结构,TestCase代码覆盖率达到100% (over 125 JUnit tests).
  • 免费的,开源的而且都是用java干的,最重要的是有很完整的javadocs支持。(Free, open source and written in 100% pure Java with complete Javadocs).

      本人鸟语有限,有些翻译不是很好,请见谅

好了,废话说的挺多的,看看到底怎么用吧。

怎么使用BoneCP

我是Maven的忠实拥护者,如果你也是,那就简单了:
你可以在你的settings.xml文件里加上下面一段,声明一个Maven仓库,如果你不想影响其他项目,那也可以在你项目的pom.xml文件里面加。

  1. <repositories>
  2. <repository>
  3. <releases>
  4. <enabled>true</enabled>
  5. </releases>
  6. <id>bonecp-repo</id>
  7. <name>BoneCP Repository</name>
  8. <url>http://jolbox.com/bonecp/downloads/maven</url>
  9. </repository>
  10. </repositories>

然后你就可以像引用其他jar包一样引用bonecp了,下面应该很熟悉

  1. <dependency>
  2. <groupId>com.jolbox</groupId>
  3. <artifactId>bonecp</artifactId>
  4. <version>0.6.7.2</version>
  5. </dependency>

如果你的项目直接用类似Hibernate的东东,没有配置dataSource的话,你很牛,那就加上下面这个吧

  1. <dependency>
  2. <groupId>com.jolbox</groupId>
  3. <artifactId>bonecp-provider</artifactId>
  4. <version>0.6.7.2</version>
  5. </dependency>

如果这些都没有满足你,那参考这里 吧。

如果你不用Spring,那应该是这样写吧:

  1. Class.forName("org.hsqldb.jdbcDriver");     // load the DB driver
  2. BoneCPConfig config = new BoneCPConfig();   // create a new configuration object
  3. config.setJdbcUrl("jdbc:hsqldb:mem:test");  // set the JDBC url
  4. config.setUsername("sa");           // set the username
  5. config.setPassword("");             // set the password
  6. config.setXXXX(...);                // (other config options here)
  7. BoneCP connectionPool = new BoneCP(config);     // setup the connection pool
  8. Connection connection;
  9. connection = connectionPool.getConnection();    // fetch a connection
  10. ...  do something with the connection here ...
  11. connection.close();             // close the connection
  12. connectionPool.shutdown();          // close the connection pool

BoneCP-Spring详细配置

主要讲一下在Spring下面怎么配置,其实更简单,只要配置dataSrouce就可以搞定。如下,具体含义见注释。

  1. <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
  2. destroy-method="close">
  3. <!-- 数据库驱动 -->
  4. <property name="driverClass" value="${aliLibrary.db.driverClass}" />
  5. <!-- 相应驱动的jdbcUrl,你懂的 -->
  6. <property name="jdbcUrl" value="${aliLibrary.db.jdbcUrl}" />
  7. <!-- 数据库的用户名 -->
  8. <property name="username" value="${aliLibrary.db.username}" />
  9. <!-- 数据库的密码 -->
  10. <property name="password" value="${aliLibrary.db.password}" />
  11. <!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
  12. <property name="idleConnectionTestPeriod" value="${aliLibrary.db.idleConnectionTestPeriod}" />
  13. <!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
  14. <property name="idleMaxAge" value="${aliLibrary.db.idleMaxAge}" />
  15. <!-- 每个分区最大的连接数 -->
  16. <property name="maxConnectionsPerPartition" value="${aliLibrary.db.maxConnectionsPerPartition}" />
  17. <!-- 每个分区最小的连接数 -->
  18. <property name="minConnectionsPerPartition" value="${aliLibrary.db.minConnectionsPerPartition}" />
  19. <!-- 分区数 ,默认值2,最小1,推荐3-4,视应用而定-->
  20. <property name="partitionCount" value="${aliLibrary.db.partitionCount}" />
  21. <!-- 每次去拿数据库连接的时候一次性要拿几个,默认值:2 -->
  22. <property name="acquireIncrement" value="${aliLibrary.db.acquireIncrement}" />
  23. <!-- 缓存prepared statements的大小,默认值:0 -->
  24. <property name="statementsCacheSize" value="${aliLibrary.db.statementsCacheSize}" />
  25. <!-- 每个分区释放链接助理进程的数量,默认值:3,除非你的一个数据库连接的时间内做了很多工作,不然过多的助理进程会影响你的性能 -->
  26. <property name="releaseHelperThreads" value="${aliLibrary.db.releaseHelperThreads}" />
  27. </bean>

其他还有些不是很常用的包括:

  1. connectionTestStatement:在做keep-alive的时候的SQL语句。
  2. statementsCachedPerConnection:No of statements that can be cached per connection,反正源码中不推荐使用,就别用了.
  3. initSQL:在每次到数据库取连接的时候执行的SQL语句,只执行一次。
  4. closeConnectionWatch:如果设置为true,则会增加一个线程监控关闭连接时的情况,如果关闭时出现异常,则打出错误日志,主要用于debug。上线后记得关掉。
  5. logStatementsEnabled:如果设置为true,就会打印执行的SQL语句,如果你用了其他能打印SQL语句的框架,那就不必了。
  6. acquireRetryDelay:在获取连接失败后,第二次参试前的延迟时间,默认为7000毫秒。
  7. acquireRetryAttempts:在获取连接失败后的重试次数,默认为5次。
  8. lazyInit:如果设置为true,那么连接池不会自动创建最小连接数的链接,而是保持为空,直到有需求要获取连接。
  9. transactionRecoveryEnabled:如果设置为true,则会保存该链接上的所有活动,以备下次重试的时候使用,这里指的活动是数据库操作。
  10. connectionHookClassName:Connection hook class name.没看懂…
  11. poolName:上面特性中说到的自定义连接池名称。
  12. disableJMX:控制JMX的支持开关。
  13. connectionTimeout:获取连接的时候最大的等待时间,默认值为:Long.MAX_VALUE

Spring里面怎么用这个dataSource就不说了吧,今天重点在BoneCP。

最后跑一个TestCase,看看日志

初始化的时候打印出BoneCP的配置参数,很清楚,关闭的时候也有日志输出。

  1. 2010-08-02 15:10:22,457 [BoneCPDataSource.java:121] [com.jolbox.bonecp.BoneCPDataSource] DEBUG com.jolbox.bonecp.BoneCPDataSource :: JDBC URL = jdbc:mysql://10.249.128.109:3306/ali_library, Username = root, partitions = 3, max (per partition) = 3, min (per partition) = 3, helper threads = 3, idle max age = 240 min, idle test period = 30 min
  2. 2010-08-02 15:10:22,457 [BoneCPDataSource.java:121] [com.jolbox.bonecp.BoneCPDataSource] DEBUG com.jolbox.bonecp.BoneCPDataSource :: JDBC URL = jdbc:mysql://10.249.128.109:3306/ali_library, Username = root, partitions = 3, max (per partition) = 3, min (per partition) = 3, helper threads = 3, idle max age = 240 min, idle test period = 30 min
  3. 2010-08-02 15:10:45,958 [BoneCP.java:129] [com.jolbox.bonecp.BoneCP] INFO  com.jolbox.bonecp.BoneCP :: Shutting down connection pool...
  4. 2010-08-02 15:10:45,958 [BoneCP.java:129] [com.jolbox.bonecp.BoneCP] INFO  com.jolbox.bonecp.BoneCP :: Shutting down connection pool...
  5. 2010-08-02 15:10:45,973 [BoneCP.java:145] [com.jolbox.bonecp.BoneCP] INFO  com.jolbox.bonecp.BoneCP :: Connection pool has been shutdown.
  6. 2010-08-02 15:10:45,973 [BoneCP.java:145] [com.jolbox.bonecp.BoneCP] INFO  com.jolbox.bonecp.BoneCP :: Connection pool has been shutdown.

接下去会写点代码横向对比一下C3p0与BoneCP的相关点。

BoneCP学习笔记的更多相关文章

  1. sharding-JDBC学习笔记

    sharding-JDBC学习笔记 ShardingSphere ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Pr ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  8. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  9. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

随机推荐

  1. Log4Qt 使用(二)

    本文基于上一篇<Log4Qt 使用(一)>来继续完善一下关于Log4Qt的使用. 在讲解之前,我们首先来看一个例子: int main(int argc, char *argv[]) { ...

  2. Java 之文件目录操作

    1.判断文件是否存在 File file = new File("d:\\study\\temp\\test.java"); boolean bl = file.exists(); ...

  3. ContextLoaderListener初始化的前后文和DispatcherServlet初始化的上下文关系

    ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层.Service层Bean: DispatcherServlet ...

  4. Char Tools,方便的字符编码转换小工具

    工作关系,常有字符编码转换方面的需要,写了这个小工具 Char Tools是一款方便的字符编码转换小工具,基于.Net Framework 2.0 Winform开发 主要功能 URL编码:URLEn ...

  5. 网页JavaScript2

    window.close()     关闭网页, window.opener.close()    关闭打开当前窗口的源窗口 间隔与延迟 window.setlnterval("执行代码&q ...

  6. The type or namespace name 'Script' does not exist in the namespace 'System.Web' (are you missing an assembly reference?)

    应该说是 .net4 的bug,没有所谓的 System.Web.Extensions.dll 库文件,需要将项目的 Target Framework修改为 3.5版本,才能加载System.Web. ...

  7. SSAS数据集Cube不存在或者尚未处理

    对Microsoft SQL Server(2008) Analysis Services(以下称SSAS) 多维数据集运行多维表达式 (MDX) 查询时,会返回这个错误消息:XXX Cube不存在, ...

  8. linux下enum的使用

    enum T { status1, status2, } Linux下: 1.做函数返回值时enum T f():不能写成T f(): 2.if(i == status1)不能写成 if(i == T ...

  9. Jquery实现日期格式化

    格式一:yyyy-MM-dd HH:mm:ss Date.prototype.format = function(format) { /* * eg:format="yyyy-MM-dd h ...

  10. Spring ioc 原理

    java程序员都知道:java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成,通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作.你 ...