问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java开发常用的几个数据库连接池

发布网友 发布时间:2022-04-26 11:15

我来回答

2个回答

热心网友 时间:2022-04-08 00:10

数据库连接池的好处是不言而喻的,现在大部分的application
server都提供自己的数据库连接池方案,此时,只要按照application server的文档说明,正确配置,即可在应用中享受到数据库连接池的好处。

但是,有些时候,我们的应用是个独立的java
application,并不是普通的WEB/J2EE应用,而且是单独运行的,不要什么application
server的配合,这种情况下,我们就需要建立自己的数据库连接池方案了。

1、 DBCP

DBCP是Apache的一个开源项目:
commons.dbcp

DBCP依赖Apache的另外2个开源项目
commons.collections和commons.pool

dbcp包,目前版本是1.2.1:http://jakarta.apache.org/commons/dbcp/

pool包,目前版本是1.3:http://jakarta.apache.org/commons/pool/,

common-collections包:http://jakarta.apache.org/commons/collections/

下载这些包并将这些包的路径添加到classpath中就可以使用dbcp做为项目中的数据库连接池使用了。

在建立我们自己的数据库连接池时,可以使用xml文件来传入需要的参数,这里只使用hard
code的方式来简单介绍,所有需要我们自己写的代码很少,只要建立一个文件如下:
import
org.apache.commons.dbcp.BasicDataSource;
import
org.apache.commons.dbcp.BasicDataSourceFactory;
import
java.sql.SQLException;
import java.sql.Connection;
import
java.util.Properties;

public class ConnectionSource {

private static BasicDataSource dataSource =
null;

public ConnectionSource() {
}

public static void init() {

if (dataSource != null) {
try
{
dataSource.close();
} catch (Exception e)
{
}

dataSource = null;
}

try {
Properties p = new
Properties();

p.setProperty("driverClassName",
"oracle.jdbc.driver.OracleDriver");
p.setProperty("url",
"jdbc:oracle:thin:@192.168.0.1:1521:testDB");

p.setProperty("password", "scott");
p.setProperty("username",
"tiger");
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) {
}

}

public static synchronized Connection
getConnection() throws SQLException {

if (dataSource == null) {

init();
}

Connection conn = null;

if (dataSource != null) {

conn = dataSource.getConnection();
}

return conn;
}
}

接下来,在我们的应用中,只要简单地使用ConnectionSource.getConnection()就可以取得连接池中的数据库连接,享受数据库连接带给我们的好处了。当我们使用完取得的数据库连接后,只要简单地使用connection.close()就可把此连接返回到连接池中,至于为什么不是直接关闭此连接,而是返回给连接池,这是因为dbcp使用委派模型来实现Connection接口了。

在使用Properties来创建BasicDataSource时,有很多参数可以设置,比较重要的还有:

testOnBorrow、testOnReturn、testWhileIdle,他们的意思是当是取得连接、返回连接或连接空闲时是否进行有效性验证(即是否还和数据库连通的),默认都为false。所以当数据库连接因为某种原因断掉后,再从连接池中取得的连接,实际上可能是无效的连接了,所以,为了确保取得的连接是有效的,
可以把把这些属性设为true。当进行校验时,需要另一个参数:validationQuery,对oracle来说,可以是:SELECT COUNT(*) FROM
DUAL,实际上就是个简单的SQL语句,验证时,就是把这个SQL语句在数据库上跑一下而已,如果连接正常的,当然就有结果返回了。

还有2个参数:timeBetweenEvictionRunsMillis 和
minEvictableIdleTimeMillis,
他们两个配合,可以持续更新连接池中的连接对象,当timeBetweenEvictionRunsMillis
大于0时,每过timeBetweenEvictionRunsMillis
时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。

还有其他的一些参数,可以参考源代码。

2、
C3P0:

C3P0是一个开放源代码的JDBC连接池,C3PO
连接池是一个优秀的连接池,推荐使用。C3PO实现了JDBC3.0规范的部分功能,因而性能更加突出,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
下载地址:http://sourceforge.net/projects/c3p0

package
com.systex.utils.web;

import java.beans.PropertyVetoException;
import
java.sql.Connection;
import java.sql.SQLException;
import
javax.sql.DataSource;
import
com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3PODataSource {
private static
ComboPooledDataSource dataSource = null;
private static final String driver
= "com.mysql.jdbc.Driver";
private static final String url =
"jdbc:mysql://localhost:3306/wyd";
private static final String userName =
"root";
private static final String password = "root";

public static DataSource getDataSource() {
if
(dataSource == null) {
dataSource = new ComboPooledDataSource();
try
{
dataSource.setDriverClass(driver);
} catch (PropertyVetoException
e) {
System.out.println("DataSource Load Driver
Exception!!");
e.printStackTrace();
}
dataSource.setJdbcUrl(url);
dataSource.setUser(userName);
dataSource.setPassword(password);
//
设置连接池最大连接容量
dataSource.setMaxPoolSize(20);
//
设置连接池最小连接容量
dataSource.setMinPoolSize(2);
//
设置连接池最大statements对象容量
dataSource.setMaxStatements(100);
}
return
dataSource;
}

public static Connection getConnection() throws
SQLException {
return
C3PODataSource.getDataSource().getConnection();
}
}

3、 Proxool

这是一个Java SQL
Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。

官方网站: http://proxool.sourceforge.net/

下载地址:http://proxool.sourceforge.net/download.html

热心网友 时间:2022-04-08 01:28

DateSource
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 数据库连接数和数据库连接池的连接数区别是什么? 数据连接池的主要作用是什么? 数据库连接池常用的有几种 常用的数据库连接池有哪些组件 常用数据库连接池有哪些?数据库连接池有何意义 数据库连接数和数据库连接池的连接数区别? 自己手工包的饺子要加什么材料,才能使饺子在冷藏室里放久些呢? 蒸鸡用什么鸡好吃 隔水蒸鸡如何做香酥又嫩口? 小鸡清蒸怎么做才好吃 模拟信号的数字化传输和基带传输有什么区别 模拟信号如何实现数字化 数字化的模拟信号是什么意思 模拟信号数字化传输是怎样实现的? 模拟信号数字化需要哪几个过程 白醋泡白术祛斑有效吗 白术加白醋可以去雀斑吗? 白术与白醋混合使用可以祛斑吗 新手机登录的抖音为什么之前加好友的提示框不见了 怎么通过加抖音好友 如何创建数据库连接池 java的3种数据库连接池用哪个好 Java数据库连接池的几种配置方法(以MySQL数 网上说能根据妊娠线判断怀的是男孩还是女孩,果真如此吗? 很多孕妇肚子上长出了妊娠纹,那么通过妊娠纹能判断胎儿性别吗? 孕妇肚上的那条黑线是什么?真的可以预测胎儿性别吗? 孕妇的妊娠线真的可以判断是男宝还是女宝? 孕妇的肚子上为什么会出现一条中线,能看出胎儿的性别吗? 怎么查生男生女 妊娠线可以判断生男生女 靠妊娠线判断孩子性别真的可靠吗? 孕妇为什么会长妊娠线,真的预示胎儿性别吗?妊娠线多久会消失呢? 怀孕后,肚子上出现的妊娠线可以判断“胎儿的性别”?不可信哦! 肚子有一条竖线生男孩还是女孩 妊娠线不明显是女孩吗 孕妈在怀孕以后肚子上为何会有一条黑线,有什么作用? 孕肚上的黑线有什么作用?产后会消失吗? 怎么算出怀的男孩女孩,从哪些方面看的啊? 产检是女孩,生了却是男娃是什么原因? 狗狗啃墙是什么原因,怎么办? 孕妇妊娠线可以看宝宝性别吗?