数据库连接池

数据库连接池

(1)数据库连接池的概念

  • 其实就是一个容器(集合) , 存放数据库连接的容器
  • 当系统初始化好后 , 容器被创建 , 容器中会申请一些连接对象 , 当用户来访问数据库时 , 从容器中获取连接对象 , 用户访问完之后 , 会将连接对象归还给容器
    • 好处 :
      • 1.节约资源
      • 2.用户访问高效

(2)数据库连接池的实现

  • 标准接口 :

    • DataSource javax.sql包下的
  • 方法 :

    • 获取连接 :

    • getConnection()
      
    • 归还连接 :

    • //如果连接对象Connection是从连接池中获取的 , 那么调用
      Connection.close();
      //方法 , 就不会再关闭连接了 , 而是把连接归还了
      

(3)C3P0 : 数据库连接池技术(比较老的)

1.步骤 :

  • 导入jar包 : c3p0-0.9.5.2.jar
  • 导入依赖 : mchange-commons-java-0.2.12.jar

2.定义配置文件 :

  • 名称 : 必须是c3p0.properties 或者 c3p0-config.xml

  • 路径 : 直接将文件放在src目录下即可

  • 修改对应的参数即可

  • <?xml version="1.0" encoding="utf-8"?>
    <c3p0-config>
      <default-config>
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/aisichen</property>
        <property name="user">root</property>
        <property name="password">acpl159357</property>
    <!--  连接池参数   -->
      <!--初始化申请的链接数量-->    
        <property name="initialPoolSize">5</property>
      <!--最大的链接数量-->
        <property name="maxPoolSize">10</property>
      <!--超时时间  ms-->
        <property name="checkoutTimeout">3000</property>
      </default-config>
    
      <named-config name="otherc3p0"> 
      </named-config>
    </c3p0-config>
    

3.创建核心对象 , 数据库连接池对象 (ComboPooledDataSource) (CPDS)

4.获取连接 : getConnection()

package com.sichen.java.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo1 {
    public static void main(String[] args) throws SQLException {
        //1.创建数据库连接对象
        ComboPooledDataSource ds = new ComboPooledDataSource();
        //2.获取连接对象
        Connection conn = ds.getConnection();
        //打印
        System.out.println(conn);
    }
}

(4)Druid : 数据库连接池技术 (阿里巴巴)

1.步骤 :

  • 1.导入jar包 druid-x.x.x.jar

  • 2.定义配置文件

    • 是properties形式的文件

    • 可以叫任意名称 , 可以放在任意目录下 (也就是说 , 这需要你手动去加载)

    • druid.properties

    • driverClassName = com.mysql.cj.jdbc.Driver
      url = jdbc:mysql://localhost:3306/aisichen
      username = root
      password = acpl159357
      #初始化的链接数量
      initialSize = 5
      #最大连接数
      maxActive = 10
      #超时时间
      maxWait = 3000
      
      filters=stat
      #每60秒运行一次空闲连接回收器
      timeBetweenEvictionRunsMillis=60000
      #池中的连接空闲30分钟后被回收,默认值就是30分钟。
      minEvictableIdleTimeMillis=1800000
      #验证连接是否可用,使用的SQL语句
      validationQuery=SELECT 1
      #指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
      testWhileIdle=true
      #借出连接时不要测试,否则很影响性能
      testOnBorrow=false
      testOnReturn=false
      poolPreparedStatements=false
      maxPoolPreparedStatementPerConnectionSize=200
      #在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3.
      numTestsPerEvictionRun=3
      
      解释:
      
      配置timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。
      
      testWhileIdle = "true" 表示每30秒,取出3条连接,使用validationQuery = "SELECT 1" 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。
      
      testOnBorrow = "false" 一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = "SELECT 1" 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。所在一定要配置为false.
      
      每30秒,取出numTestsPerEvictionRun条连接(本例是3,也是默认值),发出"SELECT 1" SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的。连接空闲30分钟后会被销毁
      
  • 3.加载配置文件

  •  //①加载配置文件
    Properties properties = new Properties();
    //②通过此类的字节码文件获取配置文件的字节输入流
    InputStream is = druidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    //③将配置文件中的属性名和属性值装载到properties对象中
    properties.load(is);
    
  • 4.获取数据库连接池对象 : 通过一个工厂类来获取

    • DruidDataSourceFactory.createDataSource(properties);
      
  • 5.获取连接 : getConnection();

  • 最终结果 :

  • package com.sichen.java;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.util.Properties;
    public class druidDemo {
        public static void main(String[] args) throws Exception {
            //加载配置文件
            Properties properties = new Properties();
            InputStream is = druidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(is);
            //获取连接对象
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
        }
    }
    

2.定义一个Druid工具类

(1)定义一个类 JDBCUtils

(2)提供静态代码块 加载配置文件 , 初始化连接池对象

(3)提供方法 :

  • ①获取连接方法 : 通过数据库连接池获取连接
  • ②释放资源
  • ③获取连接池的方法
package com.sichen.java.Util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Druid连接池的工具类
 */
public class JDBCUtils {
    //定义一个成员变量  DataSource
    private static DataSource ds;

    static{
        try {
            //1.加载配置文件
            Properties properties = new Properties();
            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(is);
            //2.获取DataSource 连接池对象
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取连接的方法 , 这里可能会发生异常 , 抛出异常
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    
    /**
     * 获取连接池的方法 , 用来在监听器中关闭连接池
     */
    public static DataSource getDataSource(){
            return ds ;
    }
}

img

on() throws SQLException {
return ds.getConnection();
}

/**
 * 获取连接池的方法 , 用来在监听器中关闭连接池
 */
public static DataSource getDataSource(){
        return ds ;
}

}


 [外链图片转存中...(img-WSfb6fe3-1646802457352)] 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值