} } }

    BoneCP进修笔记

    添加时间:2013-7-23 点击量:

    什么是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文件里面加。




    [xhtml] view plaincopy




    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了,下面应当很熟悉




    [xhtml] view plaincopy




    1. <dependency>  

    2.     <groupId>com.jolbox</groupId>  

    3.     <artifactId>bonecp</artifactId>  

    4.     <version>0.6.7.2</version>  

    5. </dependency>  



     若是你的项目直接用类似Hibernate的东东,没有设备dataSource的话,你很牛,那就加高低面这个吧
     




    [xhtml] view plaincopy




    1. <dependency>  

    2.     <groupId>com.jolbox</groupId>  

    3.     <artifactId>bonecp-provider</artifactId>  

    4.     <version>0.6.7.2</version>  

    5. </dependency>  



     若是这些都没有满足你,那参考这里 吧。



    若是你不消Spring,那应当是如许写吧:




    [java] view plaincopy




    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就可以搞定。如下,具体含义见注释。




    [xhtml] view plaincopy




    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>  



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




    [java] view plaincopy




    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的设备参数,很清楚,封闭的时辰也有日记输出。




    [xhtml] view plaincopy




    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的相干点。

    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: