zoukankan      html  css  js  c++  java
  • Java中的BoneCP数据库连接池(转载)

    BoneCP is a fast, free, open-source, Java database connection pool (JDBC Pool) library. If you are familiar with C3P0 and DBCP then you already know what this means. For the rest, this is a library that will manage a database connection for you to get faster database access in your application.
    BoneCP is fast! For some tests, it's almost 25 times faster than the next fastest connection pool option, not to mention that BoneCP never spin-locks so it won't slow down your application.
    官方主页:http://jolbox.com/
    下载地址:http://jolbox.com/bonecp/downloads/maven/com/jolbox/bonecp/
    目前最新版本为:0.6.7.2
    依赖的jar包:

    • A database that accepts connections
    • A driver to go with it
    • Google Guava library, available for free from here.
    • The SLF4J logging library.
    • JDK1.5 or higher.


      bonecp-0.7.0.jar
      google-collections-1.0.jar
      log4j-1.2.15.jar
      mysql-connector-java-5.1.6-bin.jar(mysql驱动)
      slf4j-api-1.5.10.jar
      slf4j-log4j12-1.5.10.jar
      以上jar包可以在这里下载http://jolbox.com/bonecp/downloads/maven/

      官方性能测试:

      Single Thread

      • 1,000,000 get connection / release connection requests
      • No delay between getting/releasing connection.
      • Pool size range: 20-50.
      • Acquire increment: 5
      • Helper threads: 1
      • Partition count: 1

      Multi-Thread

      • 500 threads each attempting 100 get/release connection
      • No delay between getting/releasing connection.
      • Pool size range: 50-200.
      • Acquire increment: 5
      • Helper threads: 5

      Multi-Thread 10ms delay

      • 500 threads each attempting 100 get/release connection
      • We introduce a 10ms delay (Thread.sleep()) between the acquire connection and the release connection to simulate work being done with the connection.
      • Pool size range: 50-200.
      • Acquire increment: 5
      • Helper threads: 5

      Multi-Thread 25ms delay

      • 500 threads each attempting 100 get/release connection
      • We introduce a 25ms delay (Thread.sleep()) between the acquire connection and the release connection to simulate work being done with the connection.
      • Pool size range: 50-200.
      • Acquire increment: 5
      • Helper threads: 5

      Multi-Thread 50ms delay

      • 500 threads each attempting 100 get/release connection
      • We introduce a 50ms delay (Thread.sleep()) between the acquire connection and the release connection to simulate work being done with the connection.
      • Pool size range: 50-200.
      • Acquire increment: 5
      • Helper threads: 5

      Multi-Thread 75ms delay

      • 500 threads each attempting 100 get/release connection
      • We introduce a 75ms delay (Thread.sleep()) between the acquire connection and the release connection to simulate work being done with the connection.
      • Pool size range: 50-200.
      • Acquire increment: 5
      • Helper threads: 5

      Prepared Statement (single threaded)

      • Fetches a single connection then calls 1,000,000 connection.prepareStatement(...) followed by an immediate statement close.
      • No delay between calls
      • Max statements: 30
      • Max statements per connection: 30
      • Helper threads: 5

      Prepared Statement (multi-threaded)

      • 500 Threads each attempting 100 get/release connection with no delays. After obtaining a connection, make a call to connection.prepareStatement(...) followed by a close statement request.
      • No delay between calls
      • Pool size range: 50-200.
      • Acquire increment: 5.
      • Helper threads: 5

      Prepared Statement (multi-threaded, 10ms delay)

      • 500 Threads each attempting 100 get/release connection with no delays. After obtaining a connection, make a call to connection.prepareStatement(...) followed by a close statement request.
      • 10ms delay between open connection/release connection to simulate work done by the application.
      • Pool size range: 50-200.
      • Acquire increment: 5.
      • Helper threads: 5

      Prepared Statement (multi-threaded, 25ms delay)

      • 500 Threads each attempting 100 get/release connection with no delays. After obtaining a connection, make a call to connection.prepareStatement(...) followed by a close statement request.
      • 25ms delay between open connection/release connection to simulate work done by the application.
      • Pool size range: 50-200.
      • Acquire increment: 5.
      • Helper threads: 5

      Prepared Statement (multi-threaded, 50ms delay)

      • 500 Threads each attempting 100 get/release connection with no delays. After obtaining a connection, make a call to connection.prepareStatement(...) followed by a close statement request.
      • 50ms delay between open connection/release connection to simulate work done by the application.
      • Pool size range: 50-200.
      • Acquire increment: 5.
      • Helper threads: 5

      Prepared Statement (multi-threaded, 75ms delay)

      • 500 Threads each attempting 100 get/release connection with no delays. After obtaining a connection, make a call to connection.prepareStatement(...) followed by a close statement request.
      • 75ms delay between open connection/release connection to simulate work done by the application.
      • Pool size range: 50-200.
      • Acquire increment: 5.
      • Helper threads: 5
      • 点我下载本文工程代码
        在jdbc中使用BoneCP连接池


        • package com.bonecp;
           
          import java.sql.Connection;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;
           
          import com.jolbox.bonecp.BoneCP;
          import com.jolbox.bonecp.BoneCPConfig;
           
          /** 
           * 
          @author sxyx2008
           *
           
          */
          public class ExampleJDBC {
           
              
          public static void main(String[] args) {
                  BoneCP connectionPool 
          = null;
                  Connection connection 
          = null;
           
                  
          try {
                      
          // load the database driver (make sure this is in your classpath!)
                      Class.forName("com.mysql.jdbc.Driver");
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                      
          return;
                  }
                  
                  
          try {
                      
          // setup the connection pool
                      BoneCPConfig config = new BoneCPConfig();
                      config.setJdbcUrl(
          "jdbc:mysql://localhost:3306/demo"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
                      config.setUsername("root"); 
                      config.setPassword(
          "root");
                      
          //设置每60秒检查数据库中的空闲连接数
                      config.setIdleConnectionTestPeriod(60);
                      
          //设置连接空闲时间
                      config.setIdleMaxAge(240);
                      
          //设置每个分区中的最大连接数 30
                      config.setMaxConnectionsPerPartition(30);
                      
          //设置每个分区中的最小连接数 10
                      config.setMinConnectionsPerPartition(10);
                      
          //当连接池中的连接耗尽的时候 BoneCP一次同时获取的连接数
                      config.setAcquireIncrement(5);
                      
          //连接释放处理
                      config.setReleaseHelperThreads(3);
                      
          //设置分区  分区数为3
                      config.setPartitionCount(3);
                      
          //设置配置参数
                      connectionPool = new BoneCP(config); // setup the connection pool
                      
                      connection 
          = connectionPool.getConnection(); // fetch a connection
                      
                      
          if (connection != null){
                          System.out.println(
          "Connection successful!");
                          Statement stmt 
          = connection.createStatement();
                          ResultSet rs 
          = stmt.executeQuery(" select * from person "); // do something with the connection.
                          while(rs.next()){
                              System.out.println(rs.getString(
          1)); // should print out "1"'
                              System.out.println(rs.getString(2)); // should print out "1"'
                          }
                      }
                      connectionPool.shutdown(); 
          // shutdown connection pool.
                  } catch (SQLException e) {
                      e.printStackTrace();
                  } 
          finally {
                      
          if (connection != null) {
                          
          try {
                              connection.close();
                          } 
          catch (SQLException e) {
                              e.printStackTrace();
                          }
                      }
                  }
              }
          }


          使用DataSource

          package com.bonecp;

          import java.sql.Connection;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;

          import com.jolbox.bonecp.BoneCPDataSource;

          public class ExampleDataSource {
              
              
          public static void main(String[] args) {
                  
                  Connection connection 
          = null;
                  
                  
          try {
                      Class.forName(
          "com.mysql.jdbc.Driver");
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                  }
                  
                  BoneCPDataSource dataSource
          =new BoneCPDataSource();
                  dataSource.setUsername(
          "root");
                  dataSource.setPassword(
          "root");
                  dataSource.setJdbcUrl(
          "jdbc:mysql://localhost:3306/demo");
                  dataSource.setMaxConnectionsPerPartition(
          10);
                  dataSource.setMinConnectionsPerPartition(
          5);
                  dataSource.setIdleConnectionTestPeriod(
          60);
                  dataSource.setIdleMaxAge(
          240);
                  dataSource.setAcquireIncrement(
          5);
                  dataSource.setReleaseHelperThreads(
          3);
                  
          try {
                      connection
          =dataSource.getConnection();
                      
          if (connection != null){
                          System.out.println(
          "Connection successful!");
                          Statement stmt 
          = connection.createStatement();
                          ResultSet rs 
          = stmt.executeQuery(" select * from person "); // do something with the connection.
                          while(rs.next()){
                              System.out.println(rs.getString(
          1)); // should print out "1"'
                              System.out.println(rs.getString(2)); // should print out "1"'
                          }
                      }
                  } 
          catch (SQLException e) {
                      e.printStackTrace();
                  }
          finally{
                      
          try {
                          connection.close();
                      } 
          catch (SQLException e) {
                          e.printStackTrace();
                      }
                  }
                  
                  
              }
              
          }


          在Hibernate中使用BoneCP
          在Hibernate中使用BoneCP除了需要上面提到的jar包 之外,还需要下载一个名为bonecp-provider-0.7.0.jar的bonecp-provider的jar包,它的下载位置 是:http://jolbox.com/bonecp/downloads/maven/com/jolbox/bonecp-provider /0.7.0/bonecp-provider-0.7.0.jar。
          除此之外,还需要做如下配置:

        • <!-- Hibernate SessionFactory -->  
        • <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean" autowire="autodetect">  
        •     <property name="hibernateProperties">  
        •         <props>  
        •             <prop key="hibernate.connection.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</prop>  
        •             <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>  
        •             <prop key="hibernate.connection.url">jdbc:mysql://127.0.0.1/yourdb</prop>  
        •             <prop key="hibernate.connection.username">root</prop>  
        •             <prop key="hibernate.connection.password">abcdefgh</prop>  
        •             <prop key="bonecp.idleMaxAge">240</prop>  
        •             <prop key="bonecp.idleConnectionTestPeriod">60</prop>  
        •             <prop key="bonecp.partitionCount">3</prop>  
        •             <prop key="bonecp.acquireIncrement">10</prop>  
        •             <prop key="bonecp.maxConnectionsPerPartition">60</prop>  
        •             <prop key="bonecp.minConnectionsPerPartition">20</prop>  
        •             <prop key="bonecp.statementsCacheSize">50</prop>  
        •             <prop key="bonecp.releaseHelperThreads">3</prop>  
        •         </props>  
        •     </property>  
        • </bean>  
        • xml方式配置bonecp

          <?xml version="1.0" encoding="UTF-8"?>
          <bonecp-config>  
            
          <default-config>  
              
          <property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>  
              
          <property name="username">scott</property>  
              
          <property name="password">tiger</property>  
              
          <property name="partitionCount">3</property>  
              
          <property name="maxConnectionsPerPartition">30</property>  
              
          <property name="minConnectionsPerPartition">10</property>  
              
          <property name="acquireIncrement">3</property>  
            
          </default-config>   
          </bonecp-config> 
          连接代码

          package com.bonecp;
           
          import java.sql.Connection;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;

          import com.jolbox.bonecp.BoneCP;
          import com.jolbox.bonecp.BoneCPConfig;
           
          /** 
           * 
          @author sxyx2008
           *
           
          */
          public class ExampleJDBC {
           
              
          public static void main(String[] args) {
                  BoneCP connectionPool 
          = null;
                  
                  Connection connection 
          = null;
                  
          try {
                      
          // load the database driver (make sure this is in your classpath!)
                      Class.forName("oracle.jdbc.driver.OracleDriver");
                  } 
          catch (Exception e) {
                      e.printStackTrace();
                      
          return;
                  }
                  
                  
          try {
                      
          // setup the connection pool
                      BoneCPConfig config = null;
                      
          try {
                          config 
          = new BoneCPConfig("bonecp-config.xml");
                      } 
          catch (Exception e) {
                          e.printStackTrace();
                      }
                      
          /*
                      config.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:orcl"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
                      config.setUsername("scott"); 
                      config.setPassword("tiger");
                      //设置每60秒检查数据库中的空闲连接数
                      config.setIdleConnectionTestPeriod(60);
                      //设置连接空闲时间
                      config.setIdleMaxAge(240);
                      //设置每个分区中的最大连接数 30
                      config.setMaxConnectionsPerPartition(30);
                      //设置每个分区中的最小连接数 10
                      config.setMinConnectionsPerPartition(10);
                      //当连接池中的连接耗尽的时候 BoneCP一次同时获取的连接数
                      config.setAcquireIncrement(5);
                      //连接释放处理
                      config.setReleaseHelperThreads(3);
                      //设置分区  分区数为3
                      config.setPartitionCount(3);
                      
          */
                      
          //设置配置参数
                      connectionPool = new BoneCP(config); // setup the connection pool
                      
                      
          long startTime=System.currentTimeMillis();
                      
          //创建100个连接
                      for (int i = 0; i < 100; i++) {
                          connection 
          = connectionPool.getConnection(); // fetch a connection
                      }
                      
          long endtTime=System.currentTimeMillis();
                      
                      System.out.println(
          "-------->total seconds :"+(endtTime-startTime));
                      
                      
          if (connection != null){
                          System.out.println(
          "Connection successful!");
                          Statement stmt 
          = connection.createStatement();
                          ResultSet rs 
          = stmt.executeQuery(" select * from emp "); // do something with the connection.
                          while(rs.next()){
                              System.out.println(rs.getString(
          1)); // should print out "1"'
                              System.out.println(rs.getString(2)); // should print out "1"'
                          }
                      }
                      connectionPool.shutdown(); 
          // shutdown connection pool.
                  } catch (SQLException e) {
                      e.printStackTrace();
                  } 
          finally {
                      
          if (connection != null) {
                          
          try {
                              connection.close();
                          } 
          catch (SQLException e) {
                              e.printStackTrace();
                          }
                      }
                  }
              }
          }
        点我下载本文工程代码
  • 相关阅读:
    学习PyQt5(二):PyQt5布局管理
    学习PyQt5(一):安装PyQt5以及在PyCharm上配置PyQt5
    Day037--Python--线程的其他方法,GIL, 线程事件,队列,线程池,协程
    Day036--Python--线程
    Day035--Python--管道, Manager, 进程池, 线程切换
    Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
    Day033--Python--进程
    Day032--Python--操作系统, process进程
    Day30--Python--struct, socketserver
    Day29--Python--缓冲区, 粘包
  • 原文地址:https://www.cnblogs.com/batys/p/2316792.html
Copyright © 2011-2022 走看看