使用DBCP配置JDBC连接池

使用DBCP配置JDBC连接池

1、DBCP简介
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
这里使用的版本是dbcp2。

详细介绍:http://commons.apache.org/proper/commons-dbcp/configuration.html

2、依赖jar包
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.3.jar
commons-logging.jar

下载连接 http://www.apache.org/dist/commons/

3、代码示例(以Oracle为例)
1)jdbc.properties 文件

 #连接设置 
    #Oracle
    #oracle.jdbc.driver.OracleDriver
    #SqlServer
    #com.microsoft.sqlserver.jdbc.SQLServerDriver
    #MySql
    #com.microsoft.sqlserver.jdbc.MySQLServerDriver
    driverClassName=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
    username=admin
    password=admin123

    #初始化创建的连接数,当不够时再去创建
    initialSize=10
    #最大连接数量,连接数连不能超过该值 
    maxTotal=100
    #最大空闲连接,当空闲连接超过该值时就挨个关闭多余的连接,但不能小于minldle
    maxIdle=60
    #最小空闲连接,空闲连接的最下值 -->
    minIdle=10
    #超时等待时间以毫秒为单位 6000毫秒/1000等于60秒,当连接超过该时间便认为其实空闲连接
    maxWaitMillis=60000
    #非公平锁
    #useUnfairLock=true
    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis=30000
    #配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis=60000
    #打开PSCache,并且指定每个连接上PSCache的大小
    poolPreparedStatements=true
    maxOpenPreparedStatements=100
    #maxPoolPreparedStatementPerConnectionSize=20
    #validationQuery=
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    maxConnLifetimeMillis=300000
    #连接在所指定的秒数内未使用才会被删除(秒)
    removeAbandonedTimeout=60
    #程序中的连接不使用后是否被连接池回收
    removeAbandoned=true
    removeAbandonedOnBorrow=true
    removeAbandonedOnMaintenance=true
    numTestsPerEvictionRun=10

    logAbandoned=true

    #配置监控统计拦截的filters
    #filters=stat
    #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
    #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们
    connectionProperties=useUnicode=true;characterEncoding=UTF-8
    #指定由连接池所创建的连接的自动提交(auto-commit)状态
    defaultAutoCommit=false
    #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
    #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
    defaultTransactionIsolation=SERIALIZABLE

2)使用连接池获取连接

 protected Connection getConnection() throws Exception {
        Connection conntion = null;
        BasicDataSource source = null;
        try {
            String filePath = super.getClass().getClassLoader().getResource("/").getPath() + "config/jdbc.properties";
            filePath = URLDecoder.decode(filePath);
            Properties prop = new Properties();
            prop.load(new FileReader(filePath));

   source = BasicDataSourceFactory.createDataSource(prop);

            if(source.getConnection().isWrapperFor(OracleConnection.class)){
                conntion = source.getConnection().unwrap(OracleConnection.class);
            }else{
                conntion = source.getConnection();
            }
        } catch (SQLException e) {
            LOGGER.error(">> " + e.toString());
            throw new RuntimeException("创建数据库连接失败!", e);
        } finally {
            if(source != null){
                source.close();
            }
        }
        conntion.setAutoCommit(false);
        return conntion;
    }

4、总结

maxIdle值与maxActive值应配置的接近。
当连接数超过maxIdle值后,刚刚使用完的连接就会立即被销毁。
若maxIdle与maxActive相差较大,在高负载的系统中会导致频繁的创建、销毁连接,影响性能。

工作快3年, 这还是第一次写博客,虽然有点简单,不过也算一个好的开始。

上面例子遇到一个问题,在Oracle数据库的环境下使用此方式配置连接池时,必须要修改Oracle数据库默认的连接数(默认150),修改到300以上,否则每次启动都会抛出ORA-12519: TNS:no appropriate service handler found 异常。

但是没有找到原因,哪位同学知道 还请告知啊。。

你可能感兴趣的:(JDBC)