美文网首页
JDBC编程:连接池技术DBCP、C3P0、Druid

JDBC编程:连接池技术DBCP、C3P0、Druid

作者: _Jun | 来源:发表于2020-12-04 15:56 被阅读0次

    连接池

    连接池是一种创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程所使用。数据库连接是一种关键的、昂贵的、有限的资源,使用数据库连接池能提高数据库连接的性能。

    当一个线程需要JDBC对数据库进行操作时,它从池中请求一个连接,当线程使用完这个连接,将连接返回连接池中,以准备被其它线程使用。当连接从池中“借出”,它被请求它的线程专有地使用。从编程的角度来看,这和用户的线程每当需要一个 JDBC 连接的时候调用DriverManager.getConnection() 是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。

    DBCP连接池:

    DBCP 是 Apache 软件基金组织下的开源连接池实现,要使用DBCP数据源,需要应用程序应在系统中增加如下两个 jar 文件:

    • Commons-dbcp.jar:连接池的实现
    • Commons-pool.jar:连接池实现的依赖库

    Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

    实现步骤:
    步骤一:在类目录下添加dbcp的配置文件:dbcp.ini
    步骤二:在获取数据库连接的工具类的静态代码块中创建连接池
    步骤三:释放数据库连接,在应用中获取连接。

    步骤一:在类目录下添加dbcp的配置文件:dbcp.ini

    连接设置:

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
    username=root
    password=root
    #<!-- 初始化连接 -->
    initialSize=10
    #最大连接数量
    maxActive=50
    #<!-- 最大空闲连接 -->
    maxIdle=20
    #<!-- 最小空闲连接 -->
    minIdle=5
    #<!-- 超时等待时间以毫秒为单位 60000毫秒/1000等于60秒 -->
    maxWait=60000
    #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
    #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
    connectionProperties=useUnicode=true;characterEncoding=utf-8
    #指定由连接池所创建的连接的自动提交(auto-commit)状态。
    defaultAutoCommit=true
    #driver default 指定由连接池所创建的连接的只读(read-only)状态。
    #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
    defaultReadOnly=
    #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
    

    步骤二:在获取数据库连接的工具类的静态代码块中创建连接池

    在java中,编写数据库连接池需要实现javax.sql.DataSource接口,每一个数据库连接池都是该接口的实现。

    public class DBCP {
        private static DataSource myDataSource=null;
       //在静态代码块中创建连接池
        static{
            Properties pro=new Properties();
            try {
        //加载jdbc配置文件
                pro.load(DBCP.class.getClassLoader().getResourceAsStream("dbcp.ini"));
        //创建数据源
                myDataSource= BasicDataSourceFactory.createDataSource(pro);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //从数据源中获取数据库连接
        public static Connection getConnection(){
            Connection conn=null;
            try {
                conn= myDataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    }
    

    步骤三:释放数据库连接,在应用中获取连接。

    C3P0连接池

    c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0一般是与Hibernate,Spring等框架一块使用的,当然也可以单独使用。

    dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能。

    使用c3p0需要导入c3p0.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-pre1.jar。

    实现步骤:
    步骤一:在类目录下加入C3P0的配置文件:c3p0-config.xml
    步骤二:在获取数据库连接的工具类的静态代码块创建连接池
    步骤三:释放连接,在应用中获取连接。

    步骤一:在类目录下加入C3P0的配置文件:c3p0-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    <!--  C3P0的缺省(默认)配置-->    
    <!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 -->
    
       <default-config>
          <property name="automaticTestTable">con_test</property>
          <property name="checkoutTimeout">30000</property>
          <property name="idleConnectionTestPeriod">30</property>
          <property name="initialPoolSize">10</property>
          <property name="maxIdleTime">30</property>
          <property name="maxPoolSize">100</property>
          <property name="minPoolSize">10</property>
          <property name="maxStatements">200</property>
       </default-config>
    
    <!-- C3P0的命名配置,-->     
    
    <!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource("mysql");”这样写就表示使用的是name是mysql的配置信息来创建数据源 -->
    
       <named-config name="mysql">
          <property name="driverClass">com.mysql.jdbc.Driver</property>
          <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8
       
       </property>
          <property name="user">root</property> 
          <property name="password">root</property>
          <property name="acquireIncrement">5</property>
          <property name="initialPoolSize">10</property>
          <property name="minPoolSize">5</property>
          <property name="maxPoolSize">30</property>
       </named-config>
    </c3p0-config>
    

    步骤二:在获取数据库连接的工具类的静态代码块创建连接池

    package com.wanyu.db;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    /**
     * Created by samsung on 2017/10/13.
     */
    public class C3P0 {
        public static ComboPooledDataSource cs=null;
        static {
        //通过读取C3P0的配置文件创建数据源 使用命名配置
            cs=new ComboPooledDataSource("mysql");
        }
        public static Connection getConnection(){
             Connection conn=null;
            try {
        //从数据源中获取数据库连接
                conn=cs.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    }
    

    步骤三:释放连接,在应用中获取连接。

    Druid连接池

    Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。

    • 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
    • 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
    • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
    • SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
    • 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

    使用Druid需要添加druid.jar包。

    实现步骤:
    步骤一:在类目录下加入druid的配置文件:druid.ini
    步骤二:在获取数据库连接的工具类的静态代码块中创建连接池
    步骤三:释放连接,在应用中获取数据库连接。

    步骤一:在类目录下加入druid的配置文件:druid.ini

    #mysql数据库
    url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
    username=root
    password=root
    #filters=stat
    #最大连接数量
    maxActive=2000
    #初始化连接数量
    initialSize=400
    #超时等待时间以毫秒为单位
    maxWait=3000
    #最小空闲连接
    minIdle=5
    #校验连接池中限制时间超过minEvictableIdleTimeMillis的连接对象
    timeBetweenEvictionRunsMillis=6000
    #连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒
    #minEvictableIdleTimeMillis=
    #SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前
    validationQuery=SELECT now();
    #指明连接是否被空闲连接回收器(如果有)进行检验.
    #如果检测失败,则连接将被从池中去除.
    testWhileIdle=true
    #指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.
    testOnBorrow=false
    #指明是否在归还到池中前进行检验
    testOnReturn=false
    #poolPreparedStatements=true
    #maxPoolPreparedStatementPerConnectionSize=20
    

    步骤二:在获取数据库连接的工具类的静态代码块中创建连接池

    package com.wanyu.db;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    /**
     * Created by samsung on 2017/10/13.
     */
    public class Druid {
      //创建连接池对象
        private static DataSource myDataSource=null;
        static {
            Properties pro=new Properties();
            try {
        //加载Druid配置文件
                pro.load(Druid.class.getClassLoader().getResourceAsStream("druid.ini"));
        //获取数据源
                myDataSource= DruidDataSourceFactory.createDataSource(pro);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static Connection getConnection(){
            Connection conn=null;
            try {
        //从数据源中获取数据库连接
                conn=myDataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    }
    

    步骤三:释放连接,在应用中获取数据库连接。

    相关文章

      网友评论

          本文标题:JDBC编程:连接池技术DBCP、C3P0、Druid

          本文链接:https://www.haomeiwen.com/subject/ornbwktx.html