(五)JDBC-连接池

6 篇文章 0 订阅
(五)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;
      }
   }
}


扫一扫关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值