JDBC-连接池

Posted 大数据开发笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC-连接池相关的知识,希望对你有一定的参考价值。

   
、介绍

1、连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用

2、作用

连接对象创建和销毁是需要耗费时间的,在服务器初始化的时候就初始化一些连接。把这些连接放入到内存中,使用的时候可以从内存中获取,使用完成之后将连接放入连接池中。从内存中获取和归还的效率要远远高于创建和销毁的效率,提升性能。

二、常见的开源连接池
  • druid

     Druid阿里旗下开源连接池产品

  • C3P0

    C3P0是一个开放源代码的JDBC连接池,Hibernate的发行包中默认使用此连接池。据说性能最好。

三、DBUtils

Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能

四、druid的使用

1、添加maven

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.1.23</version>
</dependency>

2、db.properties放在src目录下

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/mysqldb
username=root
password=root
initialSize=10
minIdle=5
maxActive=20
maxWait=5000

3、代码

 @Test
   /**
    * Druid的使用:
    * * 配置方式设置参数
    * Druid配置方式可以使用属性文件配置的。
    * * 文件名称没有规定但是属性文件中的key要一定的。
    */
   public void druid(){
       Connection conn = null;
       PreparedStatement pstmt = null;
       ResultSet rs = null;
       try{
           // 使用连接池:
           // 从属性文件中获取:
           Properties properties = new Properties();
           properties.load(new FileInputStream("src/druid.properties"));
           DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
           // 获得连接:
           conn = dataSource.getConnection();
           // 编写SQL:
           String sql = "select * from account";
           // 预编译SQL:
           pstmt = conn.prepareStatement(sql);
           // 设置参数:
           // 执行SQL:
           rs = pstmt.executeQuery();
           while(rs.next()){
               System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money"));
          }
      }catch(Exception e){
           e.printStackTrace();
      }finally{
           JDBCUtil.release(rs, pstmt, conn);
      }
  }
五、c3P0

1、maven

<dependency>
   <groupId>c3p0</groupId>
   <artifactId>c3p0</artifactId>
   <version>0.9.1.2</version>
</dependency>

2、c3p0-config.xml配置文件,eclipse放在src目录下,idea放在resource目录下

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql:///mydb</property>
      <property name="user">root</property>
      <property name="password">root</property>
      <property name="initialPoolSize">5</property>
      <property name="minPoolSize">5</property>
      <property name="maxPoolSize">20</property>
  </default-config>
</c3p0-config>

3、代码

@Test
/**
* 采用配置文件的方式:
*/
public void c3p0(){
   Connection conn = null;
   PreparedStatement pstmt = null;
   ResultSet rs = null;
   try{
       // 获得连接:从连接池中获取:
       // 创建连接池://创建连接池默认去类路径下查找c3p0-config.xml
       ComboPooledDataSource dataSource = new ComboPooledDataSource();
       // 从连接池中获得连接:
       conn = dataSource.getConnection();
       // 编写SQL:
       String sql = "select * from account";
       // 预编译SQL:
       pstmt = conn.prepareStatement(sql);
       // 执行SQL:
       rs = pstmt.executeQuery();
       while(rs.next()){
           System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money"));
      }
  }catch(Exception e){
       e.printStackTrace();
  }finally{
       JDBCUtil.release(rs, pstmt, conn);
  }
}

六、c3p0连接池工具类

1、代码

/**
* JDBC的工具类
* @author jt
*
*/
public class JDBCUtils2 {
  // 创建一个连接池:但是这个连接池只需要创建一次即可。
  private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();

  /**
   * 获得连接的方法
   * @throws SQLException
   */
  public static Connection getConnection() throws SQLException{
     return dataSource.getConnection();
  }

  /**
   * 获得连接池:
   */
  public static DataSource getDataSource(){
     return dataSource;
  }

  /**
   * 释放资源的方法
   */
  public static void release(Statement stmt,Connection conn){
     if(stmt != null){
        try {
           stmt.close();
        } catch (SQLException e) {
           e.printStackTrace();
        }

        stmt = null;
    }
     if(conn != null){
        try {
           conn.close();
        } catch (SQLException e) {
           e.printStackTrace();
        }
        conn = null;
    }
  }

  public static void release(ResultSet rs,Statement stmt,Connection conn){
     // 资源释放:
     if(rs != null){
        try {
           rs.close();
        } catch (SQLException e) {
           e.printStackTrace();
        }

        rs = null;
    }
     if(stmt != null){
        try {
           stmt.close();
        } catch (SQLException e) {
           e.printStackTrace();
        }

        stmt = null;
    }
     if(conn != null){
        try {
           conn.close();
        } catch (SQLException e) {
           e.printStackTrace();
        }
        conn = null;
    }
  }
}




以上是关于JDBC-连接池的主要内容,如果未能解决你的问题,请参考以下文章

JDBC自定义连接池

数据库连接池的Java连接池

JDBC 连接池错误

MySQL 和 JDBC 连接池:未关闭的语句

用Java手动封装JDBC连接池

哪个更好:JDBC 连接池,还是使用 SIngleton 类进行 JDBC 连接?