• 数据源连接池


    一、数据源连接池

    1、为什么需要使用连接池

    ​ 由于数据库的连接和关闭是一项非常耗时的任务,而用户在操作数据时会频繁的对数据库资源访问和关闭,为了提高数据库连接的性能,提高系统运行效率,提出用专门的容器管理数据库的连接和释放 ,数据库连接池就是为了解决这一问题而发明的。

    2、什么是连接池

    ​ 数据库连接池表示用于分配、管理、释放数据库连接的容器, 可以有效提高数据库连接的复用性和性能,可以将一个连接多次使用,而不释放给数据库。 可以通过设置各项参数(例如最大连接数,最大空闲时间,等待连接时长 )

    ​ 类似这样的容器还有很多,例如 常量池,线程池

    ​ 一般在项目开发中使用开源的数据库连接池 ,常用 c3p0 、dbcp、德鲁伊连接池 ,也可以自定义连接池 ,

    ​ 基本原理: 容器初始化默认获取n个连接 , 应用程序需要建立连接直接从容器中获取,一旦容器的连接池分配完毕,但没有超出容器连接上限,此时可以继续从数据库建立连接, 应用程序使用完将连接对象释放给容器 , 以便再次使用 ,如果容器的连接超出默认连接数,会自动释放多余的连接。如果连接数超时容器设置的最大连接数,则不会获取新的连接,需要等待其他资源释放才可使用。

    3、自定义连接池理解连接池原理

    ​ 假设有一个存放连接对象的容器 ,可以使用集合存储连接对象(Connection) ,

    4、使用开源的连接池

    1、DBCP连接池(DataBase Connection Pool)

    数据库开源连接池 提供一些基础配置,在管理连接池之前,需要配置数据源 DataSource

    ​ 步骤1:导入开源jar包

    ​ commons-dbcp.jar 、

    ​ commons-pool.jar

    ​ 步骤2: 写dbcp.properties配置文件

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/j2008_db?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    username=root
    password=123456
    #最大连接数
    maxActive=50
    #最小连接数
    minIdle=10
    #最小空闲数
    maxIdle=10
    #初始化连接数
    initialSize=5
    #空闲线程超时回收时间
    removeAbandonedTieout=10
    #最大等待时间  毫秒
    maxWait=1000
    

    步骤三:

        //  也通过读配置文件,将配置信息加载
            try {
                // 1、读取配置文件
                InputStream is =DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
                Properties prop = new Properties();
                // 2、加载属性文件
                prop.load(is);
                //3、 通过数据源工厂类
                ds = BasicDataSourceFactory.createDataSource(prop);
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    步骤四: 测试并获取连接对象

     /**
         * 获取数据源连接对象
         * @return
         */
        public static Connection getConn(){
    
            try {
                if(ds!=null) {
                    return ds.getConnection();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    

    2 Druid连接池

    DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。

    ​ 替换前一个dbcp的jar包

    ​ druid-1.1.22.jar

    其他配置于dbcp的非常相似

    和其它连接池一样DRUID的DataSource类为:com.alibaba.druid.pool.DruidDataSource

    常用配置如下:

     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
      init-method="init" destroy-method="close"> 
      <property name="driverClassName" value="${jdbc.driverClassName}" /> 
      <property name="url" value="${jdbc.url}" /> 
      <property name="username" value="${jdbc.username}" /> 
      <property name="password" value="${jdbc.password}" /> 
      <!-- 配置初始化大小、最小、最大 --> 
      <property name="initialSize" value="1" /> 
      <property name="minIdle" value="1" /> 
      <property name="maxActive" value="10" />
     
      <!-- 配置获取连接等待超时的时间 --> 
      <property name="maxWait" value="10000" />
     
      <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
      <property name="timeBetweenEvictionRunsMillis" value="60000" />
     
      <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 
      <property name="minEvictableIdleTimeMillis" value="300000" />
     
      <property name="testWhileIdle" value="true" />
     
      <!-- 这里建议配置为TRUE,防止取到的连接不可用 --> 
      <property name="testOnBorrow" value="true" /> 
      <property name="testOnReturn" value="false" />
     
      <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 
      <property name="poolPreparedStatements" value="true" /> 
      <property name="maxPoolPreparedStatementPerConnectionSize" 
       value="20" />
     
      <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
     
      <property name="defaultAutoCommit" value="true" />
     
      <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> 
      <property name="validationQuery" value="select 1 " /> 
      <property name="filters" value="stat" /> 
      <property name="proxyFilters"> 
       <list> 
        <ref bean="logFilter" /> 
       </list> 
      </property> 
     </bean>
    
    

    在代码中创建数据源

    druid.properties:

    driverClassName=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/j2008_db?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    username=root
    password=123456
        其他基础配置同上
    
    static DataSource ds ;
        static{
            try {
                // 1、读取配置文件
                InputStream is =DBCPUtil.class.getClassLoader().getResourceAsStream("druid.properties");
                Properties prop = new Properties();
                // 2、加载属性文件
                prop.load(is);
                //3、 通过数据源工厂类
                 ds = DruidDataSourceFactory.createDataSource(prop);
                System.out.println(ds.getConnection());
           } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/z5452830/p/14053522.html
Copyright © 2020-2023  润新知