Apache DBCP总览和常用参数说明等

DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目。由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

也是 tomcat、hibernate等开源工具使用的连接池组件。

DBCP版本已经整体升级到2.0时代,并且在jar包上做了升级,诸如org.apache.commons.dbcp2.BasicDataSource。

Jar包为:commons-dbcp2-2.0.1.jar

  • DBCP 2.0.1 for JDBC 4.1 (Java 7+)
  • DBCP 1.4 for JDBC 4 (Java 6)
  • DBCP 1.3 for JDBC 3 (Java 1.4 and Java 5)

必须配置的参数

Username  建立数据库连接的用户名;

Password  建立数据库连接的密码;

URL  传递给JDBC驱动的用于建立连接的URL

DriverClassName  使用的JDBC驱动的完整有效的java 类名

connectionProperties 当建立新连接时被发送给JDBC驱动的连接参数,格式必须是key=value格式

连接池相关配置

initialSize  初始化连接:连接池启动时创建的初始化连接数量

maxActive 最大活动连接:连接池在同一时间能够分配的最大活动连接的数量,类似于并发量,设为0表示无限制 ,2.0版本中,已经去掉该方法,对应替代的方法为:setMaxTotal();

maxIdle 最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制。

minIdle  最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建

maxWait  最大建立连接等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等,2.0中已经去掉该方法,替代方法为:setMaxWaitMillis();

其他相关配置

removeAbandoned  是否自动回收超时连接

removeAbandonedTimeout 设置超时时间有一个要注意的地方,超时时间=现在的时间-程序中创建Connection的时间,如果 maxActive比较大,比如超过100,那么removeAbandonedTimeout可以设置长一点比如180,也就是三分钟无响应的连接进行回收,当然应用的不同设置长度也不同。

timeBetweenEvictionRunsMillis, minEvictableIdleTimeMillis一起使用,每timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

testOnBorrow、testOnReturn、testWhileIdle ,这些属性的意义是取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证。所以当使用DBCP时,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际已经时无效的数据库连接了。网上很多说DBCP的bug应该都是如此吧,只有把这些属性设为true,再提供_validationQuery语句就可以保证数据库连接始终有效了。

一个普通的简单示例:

package test.ffm83.commons.dbcp;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import org.apache.commons.lang.StringUtils;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Connection;

import java.util.Properties;

/* 通过dbcp连接oracle数据库

* 使用1.4版本实现

* @author 范芳铭

* */

public
class
DbcpUsage {

private
static
BasicDataSource dataSource =
null;

public DbcpUsage() {

}

public
static void
init() {

if (dataSource !=
null) {

try {

dataSource.close();

}catch(Exception e) {

e.printStackTrace();

}

dataSource =
null;

}

try {

Propertiesp = newProperties();

p.setProperty("driverClassName","oracle.jdbc.driver.OracleDriver");

p.setProperty("url",
"jdbc:oracle:thin:@192.168.19.1:1521:fanfangming");

p.setProperty("password","ffm");

p.setProperty("username","ffm");

p.setProperty("maxActive","30");

p.setProperty("maxIdle","10");

p.setProperty("maxWait","1000");

p.setProperty("removeAbandoned","false");

p.setProperty("removeAbandonedTimeout",
"120");

p.setProperty("testOnBorrow","true");

p.setProperty("logAbandoned","true");

dataSource =(BasicDataSource) BasicDataSourceFactory

.createDataSource(p);

}catch(Exception e) {

e.printStackTrace();

}

}

public
static synchronized
ConnectiongetConnection()
throwsSQLException {

if (dataSource ==
null) {

init();

}

Connectionconn = null;

if (dataSource !=
null) {

conn= dataSource.getConnection();

}

return conn;

}

public
static void
main(String[] args)
throws Exception {

Connectioncon = null;

try {

con= DbcpUsage.getConnection();

Stringsql = " select sysdate from dual ";

PreparedStatementps = con.prepareStatement(sql);

ResultSetrs = ps.executeQuery();

while (rs.next()) {

Stringvalue = rs.getString("sysdate");

System.out.println(StringUtils.center(value+",数据库连接成功", 50,
"-"));

}

}catch(Exception e) {

e.printStackTrace();

}finally{

if (con !=
null) {

con.close();

}

}

}

}

运行如下:

----------2014-12-1612:38:32.0,数据库连接成功-----------

时间: 2024-10-25 02:49:31

Apache DBCP总览和常用参数说明等的相关文章

DBCP连接池配置参数说明

<!-- 数据源1 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property n

Apache的几种常用配置

Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一. 下面介绍几个常用的apache命令: /usr/local/apache2/bin/apachectl -M  查看常见的模块(包括动态和静态) /usr/local/apache2/bin/apachectl -l    查看加载的静态模块 /usr/local/apache2/bin/apachectl -t    检查配置文件有无

JDBC DataSource Example – Oracle, MySQL and Apache DBCP Tutorial

We have already seen that JDBC DriverManager can be used to get relational database connections. But when it comes to actual programming, we want more than just connections. Most of the times we are looking for loose coupling for connectivity so that

Apache DBCP数据库连接池溢出调整

数据库最大连接池溢出是在系统运行中比较常见的一个问题,在开发中,可以通过设置最大连接池的各位为1或者2,就能在开发的时候发现数据库连接没有被释放的情况.不过这个小技巧在hibernate和sping等框架大量使用之后就没什么用了. 数据库连接池溢出的源代码: package test.ffm83.commons.dbcp; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.BasicDat

使用Apache DBCP连接池重构DBUtility,让连接数据库更有效,更安全

直接使用JDBC访问数据库时,需要避免以下隐患: 1. 每一次数据操作请求都需要建立数据库连接.打开连接.存取数据和关闭连接等步骤.而建立和打开数据库连接是一件既耗资源又费时的过程,如果频繁发生这种数据库操作,势必会使系统性能下降. 2. 连接对象代表着数据库系统的连接进程,是有限的资源.如果系统的使用用户非常多,有可能超出数据库服务器的承受极限,造成系统的崩溃. 数据库连接池是解决上述问题最常用的方法.所谓连接池,即可以创建并持有数据库连接的组件.连接池可以预先创建并封装一些连接对象并将其缓存

(数据库)DBCP连接池配置参数说明

<!-- 数据源1 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property n

Apache DBCP连接数据库异常重连

我09年负责的一个项目,有好几组P590小机提供服务,有一次,我们的小机居然集体宕机了,数据库不能服务后,所有的应用自然也没法提供服务.当数据库恢复后,所有的应用的数据库连接也是无效的,当时只有一一重启才生效.而出了问题的数据库,后续又频繁出一些小故障,因为应用的数据库连接是失效的,只能通过后续重启才能提供服务,导致应用又有了进一步的滞后性.因此后续就开始关注数据库重练. 下面这个应用场景,是用DBCP连接本地一个oracle数据库.启动应用后,把数据库关闭,然后又把数据库开启,查看connec

clang format 自定义样式常用参数说明

常用的格式设置: #如果为真(true),分析格式化过的文件中最常见的&和*的对齐方式.然后指针对齐仅作为回退 DerivePointerAlignment: false #缩进宽度 IndentWidth: 4 #@[]里面两边空格,原true SpacesInContainerLiterals: false #OC中,在@property之后添加空格, 例如:使用 \@property (readonly) 而不是 \@property(readonly). ObjCSpaceAfterPr

mysqldump使用常用参数说明

参数说明 --all-databases  , -A 导出全部数据库. mysqldump  -uroot -p --all-databases --all-tablespaces  , -Y 导出全部表空间. mysqldump  -uroot -p --all-databases --all-tablespaces --no-tablespaces  , -y 不导出任何表空间信息. mysqldump  -uroot -p --all-databases --no-tablespaces