- 浏览: 52018 次
- 性别:
- 来自: 广州
最新评论
两种开源的数据库连接池
JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
DBCP 数据库连接池
C3P0 数据库连接池
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池
DBCP 数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool. 如需使用该连接池实现,应在系统中增加如下两个 jar 文件:
Commons-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖库
使用cbcp数据源,当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
具体的使用代码例子如下:
所有数据库连接在一个xml文件中配置,文件内容如下
username=root
password=1234
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#最大空闲连接
maxIdle=20
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
maxWait=60000
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED
而具体获得连接的代码:
Properties props = new Properties();
从上面的xml文档中读取数据库连接需要的各种数据props.load(TestDBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
获得DataSource对象
DataSource ds = BasicDataSourceFactory.createDataSource(props);
从数据库连接池中获得连接
Connection conn = ds.getConnection();
并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
conn.close();
使用c3p0数据源
首先,加载“c3p0-0.9.1.2.jar”
然后具体的使用代码示范如下:
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setUser("root");
cpds.setPassword("123");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
cpds.setDriverClass("com.mysql.jdbc.Driver");
//设置初始化连接数
cpds.setInitialPoolSize(10);
//最大连接数量
cpds.setMaxPoolSize(50);
//最小连接
cpds.setMinPoolSize(20);
//超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
cpds.setMaxIdleTime(60000);
Connection conn = cpds.getConnection();
Tomcat数据库连接池的配置
DataSource对象可由容器(Tomcat)提供,不能使用创建实例的方法来生成DataSource对象,要采用JAVA的JNDI。
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一些标准API接口,Java程序通过这些API可以访问命名目录服务。而命名目录服务将名称和对象联系起来,使得可以用名称访问对象。
JNDI的定义不依赖于任何独立的命名目录服务器,对于各种命名目录服务器,都可通过统一的JNDI接口调用。
JNDI在系统运行时会在内存中构建这个一个层次结构。通过程序访问到这个JNDI管理器的InitialContext对象就拥有了这个JNDI的上下文,就可以查找要用的对象,并使用它
JNDI接口概述
Context:javax.naming的核心接口,指定了命名上下文。定义了基本的操作,例如添加一个名称-对象的绑定,查找绑定到特定名称的对象,显示绑定列表,移除名称-对象绑定,创建或者销毁相同类型的上下文等
//从服务器上连接
Context ctx=new InitialContext()
Context.lookup():检索指定的对象
为了使用JNDI,需要实现做两个工作
1.写context.xml文档,并放置到META-INF目下
2.在tomcat服务器的lib目录下复制上数据库驱动的jar包
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
指定Resource的JNDI的名字
name="testdatasource"
Container:表示由容器来负责创建和管理 Application:表示由web应用来创建和管理
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="5131"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/itcast"/>
</Context>
Tomcat提供了一个与JavaEE应用服务相兼容的JNDI--InitialContext实现实例(把DataSource作为一种可配置的JNDI资源来处理)。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。
获得数据库连接的具体代码:(注意,这个时候数据库连接只能通过tomcat服务器来获取,所以这些代码只能写在tomcat可以访问到的部分,比如jsp页面或者servlet)
Context context = new InitialContext();
后面红色部分要和context.xml中配置的“name”属性一致
DataSource ds =(DataSource)context.lookup("java:comp/env/testdatasource");
Org.apache.commons.dbutils的使用
先解释一段代码:
import org.apache.commons.dbutils.QueryRunner;
QueryRunner run = new QueryRunner();
list = (List) run.query(conn, sql, new BeanListHandler(clazz));
这里的run.query(conn, sql, new BeanListHandler(clazz))就可以返回一个查询对象的list,其中的“new BeanListHandler(clazz)”是一个实现了ResultSetHandler接口的对象。其中传入的clazz对象是需要被放入List的实体对象的JavaBean对象。比如下面的使用方法
//param 1: 数据库连接
// 2: 查询数据库用的 sql
// 3: 替换 sql 中的参数数组
// 4: 如何处理得到的结果集
List list = (List) run.query(conn, sql, params, new BeanListHandler(Customer.class));
最后得到的List就是一个Customer对象集合,dbutils会自动把查询到的结果放置到Customer类的对象中。
关于ResultSetHandler接口,前面看到的 BeanListHandler(Customer.class)实际上就是实现了这个接口,在这个接口内部只有一个方法:
public Object handle(ResultSet rs) throws SQLException
可以看到,这个方法中传入的参数就是执行sql后的结果集合,而我们用的这个BeanListHandler类其实就是实现了这个方法,拿到处理的结果集以后,根据传入的javaBean的class对象利用内省把查询到的数据放置到这个javabean的对象中。
作为示范,我们自己实现一个
//使用自定义的 ResultSetHandler 对象
list = (List) run.query(conn, sql, params,
自定义一个实现ResultSetHandler接口的匿名对象
new ResultSetHandler(){
实现接口中的方法,获得结果集中的数据,自己装入对象并装入list中。
public Object handle(ResultSet rs) throws SQLException {
List list = new ArrayList();
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String address = rs.getString(3);
String phone = rs.getString(4);
Customer cust = new Customer();
cust.setAddress(address);
cust.setId1(id);
cust.setName(name);
cust.setPhone(phone);
list.add(cust);
}
return list;
}
});
利用Org.apache.commons.dbutils中的方法,我们可以非常方便的进行JDBC的操作。
比如
下面代码可以执行所有的数据修改操作,只需要传入sql和参数,还有connection就可以了
public void update(Connection conn, String sql, Object [] params, String exceptionMsg){
QueryRunner run = new QueryRunner();
try {
run.update(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(exceptionMsg);
}
}
public Object getObject(Connection conn, String sql, Object [] prams, Class clazz, String exceptionMsg){
List list = null;
QueryRunner run = new QueryRunner();
try {
list = (List) run.query(conn, sql, prams, new BeanListHandler(clazz));
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(exceptionMsg);
}
if(list != null)
return list.get(0);
else
return null;
}
public List getConditionObjects(Connection conn, String sql, Object [] prams, Class clazz, String exceptionMsg){
List list = null;
QueryRunner run = new QueryRunner();
try {
list = (List) run.query(conn, sql, prams, new BeanListHandler(clazz));
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(exceptionMsg);
}
return list;
}
JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
DBCP 数据库连接池
C3P0 数据库连接池
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池
DBCP 数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool. 如需使用该连接池实现,应在系统中增加如下两个 jar 文件:
Commons-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖库
使用cbcp数据源,当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
具体的使用代码例子如下:
所有数据库连接在一个xml文件中配置,文件内容如下
username=root
password=1234
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#最大空闲连接
maxIdle=20
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
maxWait=60000
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_COMMITTED
而具体获得连接的代码:
Properties props = new Properties();
从上面的xml文档中读取数据库连接需要的各种数据props.load(TestDBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
获得DataSource对象
DataSource ds = BasicDataSourceFactory.createDataSource(props);
从数据库连接池中获得连接
Connection conn = ds.getConnection();
并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
conn.close();
使用c3p0数据源
首先,加载“c3p0-0.9.1.2.jar”
然后具体的使用代码示范如下:
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setUser("root");
cpds.setPassword("123");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
cpds.setDriverClass("com.mysql.jdbc.Driver");
//设置初始化连接数
cpds.setInitialPoolSize(10);
//最大连接数量
cpds.setMaxPoolSize(50);
//最小连接
cpds.setMinPoolSize(20);
//超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
cpds.setMaxIdleTime(60000);
Connection conn = cpds.getConnection();
Tomcat数据库连接池的配置
DataSource对象可由容器(Tomcat)提供,不能使用创建实例的方法来生成DataSource对象,要采用JAVA的JNDI。
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一些标准API接口,Java程序通过这些API可以访问命名目录服务。而命名目录服务将名称和对象联系起来,使得可以用名称访问对象。
JNDI的定义不依赖于任何独立的命名目录服务器,对于各种命名目录服务器,都可通过统一的JNDI接口调用。
JNDI在系统运行时会在内存中构建这个一个层次结构。通过程序访问到这个JNDI管理器的InitialContext对象就拥有了这个JNDI的上下文,就可以查找要用的对象,并使用它
JNDI接口概述
Context:javax.naming的核心接口,指定了命名上下文。定义了基本的操作,例如添加一个名称-对象的绑定,查找绑定到特定名称的对象,显示绑定列表,移除名称-对象绑定,创建或者销毁相同类型的上下文等
//从服务器上连接
Context ctx=new InitialContext()
Context.lookup():检索指定的对象
为了使用JNDI,需要实现做两个工作
1.写context.xml文档,并放置到META-INF目下
2.在tomcat服务器的lib目录下复制上数据库驱动的jar包
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
指定Resource的JNDI的名字
name="testdatasource"
Container:表示由容器来负责创建和管理 Application:表示由web应用来创建和管理
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="5131"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/itcast"/>
</Context>
Tomcat提供了一个与JavaEE应用服务相兼容的JNDI--InitialContext实现实例(把DataSource作为一种可配置的JNDI资源来处理)。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。
获得数据库连接的具体代码:(注意,这个时候数据库连接只能通过tomcat服务器来获取,所以这些代码只能写在tomcat可以访问到的部分,比如jsp页面或者servlet)
Context context = new InitialContext();
后面红色部分要和context.xml中配置的“name”属性一致
DataSource ds =(DataSource)context.lookup("java:comp/env/testdatasource");
Org.apache.commons.dbutils的使用
先解释一段代码:
import org.apache.commons.dbutils.QueryRunner;
QueryRunner run = new QueryRunner();
list = (List) run.query(conn, sql, new BeanListHandler(clazz));
这里的run.query(conn, sql, new BeanListHandler(clazz))就可以返回一个查询对象的list,其中的“new BeanListHandler(clazz)”是一个实现了ResultSetHandler接口的对象。其中传入的clazz对象是需要被放入List的实体对象的JavaBean对象。比如下面的使用方法
//param 1: 数据库连接
// 2: 查询数据库用的 sql
// 3: 替换 sql 中的参数数组
// 4: 如何处理得到的结果集
List list = (List) run.query(conn, sql, params, new BeanListHandler(Customer.class));
最后得到的List就是一个Customer对象集合,dbutils会自动把查询到的结果放置到Customer类的对象中。
关于ResultSetHandler接口,前面看到的 BeanListHandler(Customer.class)实际上就是实现了这个接口,在这个接口内部只有一个方法:
public Object handle(ResultSet rs) throws SQLException
可以看到,这个方法中传入的参数就是执行sql后的结果集合,而我们用的这个BeanListHandler类其实就是实现了这个方法,拿到处理的结果集以后,根据传入的javaBean的class对象利用内省把查询到的数据放置到这个javabean的对象中。
作为示范,我们自己实现一个
//使用自定义的 ResultSetHandler 对象
list = (List) run.query(conn, sql, params,
自定义一个实现ResultSetHandler接口的匿名对象
new ResultSetHandler(){
实现接口中的方法,获得结果集中的数据,自己装入对象并装入list中。
public Object handle(ResultSet rs) throws SQLException {
List list = new ArrayList();
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String address = rs.getString(3);
String phone = rs.getString(4);
Customer cust = new Customer();
cust.setAddress(address);
cust.setId1(id);
cust.setName(name);
cust.setPhone(phone);
list.add(cust);
}
return list;
}
});
利用Org.apache.commons.dbutils中的方法,我们可以非常方便的进行JDBC的操作。
比如
下面代码可以执行所有的数据修改操作,只需要传入sql和参数,还有connection就可以了
public void update(Connection conn, String sql, Object [] params, String exceptionMsg){
QueryRunner run = new QueryRunner();
try {
run.update(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(exceptionMsg);
}
}
public Object getObject(Connection conn, String sql, Object [] prams, Class clazz, String exceptionMsg){
List list = null;
QueryRunner run = new QueryRunner();
try {
list = (List) run.query(conn, sql, prams, new BeanListHandler(clazz));
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(exceptionMsg);
}
if(list != null)
return list.get(0);
else
return null;
}
public List getConditionObjects(Connection conn, String sql, Object [] prams, Class clazz, String exceptionMsg){
List list = null;
QueryRunner run = new QueryRunner();
try {
list = (List) run.query(conn, sql, prams, new BeanListHandler(clazz));
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(exceptionMsg);
}
return list;
}
发表评论
-
Apache2(.2)+tomcat+JK 集群
2010-10-20 13:29 1682看了不少关于配置apache+ ... -
常见的Exception in thread"main" java.lang.NoClassDefFoundError的几种解决方式
2010-09-17 11:38 31931、你的文件名对吗? JAVA要求你的文件和你的类名严格对应的 ... -
Struts2中Session的使用
2010-05-11 11:42 1231Struts2中关于Session的使用 在Struts2 ... -
java.util.ConcurrentModificationException 异常解决办法
2010-05-10 22:30 1270【错误原因】: 当某个线程对一个Collection / Ma ... -
Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别
2010-05-10 22:24 1021ArrayList和HashMap是异步的,Vector和Ha ... -
java配合tomcat实现动态2级域名效果
2010-04-20 15:25 1515开始之前,首先来认识下什么是2级域名? 一般我们注册一个域 ... -
JVM参数配置大全
2009-12-01 20:35 888堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数 ... -
常见问题解答
2009-09-20 00:42 902常见问题解答 Tomcat 启动后,出现一个登陆页面,但进 ... -
The method getJspApplicationContext(ServletContext
2009-06-08 10:56 1127今天开发遇到这个错误: The method getJspAp ... -
java 服务器端ip验证
2009-05-08 11:33 1644以下是验证方法: validateAnIpAddressWit ... -
常见异常记录
2009-04-24 09:31 1205一、我在开发中遇到这样的错误: javax.servlet ...
相关推荐
Java JDBC 数据库连接池总结 Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理之一。Java 语言通过 JDBC 技术访问数据库,JDBC 是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发人员...
对于开发者来说,了解并掌握如Druid这样的连接池工具,不仅可以提高代码质量,也有助于解决可能出现的性能问题。在实际开发中,结合日志监控和性能测试,可以不断优化数据库连接池的配置,从而达到最佳的运行效果。
总结来说,数据库连接池是提高Java应用程序数据库访问效率的重要工具。通过自定义连接池,开发者可以更直观地理解连接池的工作原理,这对深入学习数据库编程和系统优化具有积极的意义。对于初学者而言,这是一个很好...
这是 C3P0 数据库连接池的依赖库,主要用于提供一些通用的工具类和异常处理。C3P0 使用这个库来完成对数据库连接的管理。 3. C3P0 (c3p0-0.9.5.2.jar): C3P0 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI ...
本文将深入探讨在Delphi中如何利用ADO构建数据库连接池,并结合提供的`UP_AdoDb.pas`源代码文件进行分析。 首先,我们需要了解什么是ADO。ADO是Microsoft提出的一种数据访问接口,它允许开发者通过简单的API与各种...
数据库连接池是现代应用程序中管理数据库连接的重要工具,它能够有效地提高系统性能并优化资源利用率。在Java开发中,有三种常见的数据库连接池实现:DBCP(BasicDataSource)、C3P0以及阿里开源的Druid。下面将详细...
接下来,我们将通过对比实验来分析数据库连接池的性能优势。假设我们有两个版本的应用,一个使用数据库连接池,另一个不使用。在高并发环境下,我们可以观察到以下差异: 1. 响应时间:由于连接池减少了创建和关闭...
数据库连接池是数据库管理中的重要概念,主要用于优化数据库操作,提高系统性能。它在应用程序和数据库之间起到资源管理和复用的作用,避免了每次数据库操作都需建立和关闭连接的开销。本文将深入探讨数据库连接池的...
BoneCP是一款高效、轻量级的Java数据库连接池实现,它的源码分析对于我们理解数据库连接池的工作原理,优化数据库性能以及进行二次开发具有重要意义。 首先,我们需要了解数据库连接池的基本概念。数据库连接池是...
数据库连接池是现代应用程序中管理数据库连接的重要工具,它的核心作用是提高数据库访问效率,减少系统资源消耗。在Java环境中,实现数据库连接池的方式多种多样,既可以集成到服务器容器(如Tomcat)的配置文件中,...
PRXool是一款开源的数据库连接池,它提供了一种高效且稳定的管理数据库连接的方式,尤其在多用户并发访问时,能显著提升系统性能。数据库连接池是应用服务器中非常重要的一部分,它通过预先创建并维护一定数量的...
Java数据库连接池C3P0是一种常用的开源数据库连接管理工具,它通过提供连接池服务,提高了应用程序处理数据库连接的效率,降低了系统资源的消耗。在Java应用中,尤其是在服务器端,数据库连接的创建和关闭是相对耗时...
论文部分可能涵盖了对数据库连接池原理的深入分析,对比不同连接池工具的性能,以及在JSP项目中实施的具体步骤和遇到的问题及解决方案。源代码则提供了实际的实现示例,有助于理解理论知识在实际开发中的应用。 总...
MySQL数据库连接池是数据库管理中的一个重要概念,它在Linux环境下被广泛应用。数据库连接池是一种管理数据库连接的技术,通过预先创建并维护一定数量的数据库连接,为应用程序提供高效、可靠的数据库访问服务。它...
标题 "JMeter测试有无数据库连接池的性能" 涉及到的关键知识点主要集中在性能测试工具Apache JMeter以及数据库连接池在系统性能优化中的作用。这篇博客文章可能通过使用JMeter来比较系统在使用和不使用数据库连接池...
C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了C3P0的0.9.5.2版本,以及相关的依赖库。下面将详细介绍C3P0的功能、工作原理以及如何使用。 C3P0...
**PoolMan数据库连接池**是Java环境中用于管理数据库连接的一种高效、可靠且可扩展的工具。连接池在软件设计中扮演着重要角色,特别是在高并发的Web应用中,通过复用已建立的数据库连接,避免了频繁创建和销毁连接...
总的来说,对象池、线程池和数据库连接池是Java中提高系统性能和资源利用率的重要工具。它们通过复用对象和线程,减少了内存分配和系统调用,优化了系统的并发处理能力,对于大型、高并发的应用场景尤其重要。理解和...
数据库连接池是Java应用程序中广泛使用的技术,用于管理和优化数据库连接。它允许应用程序重用已建立的数据库连接,而不是每次需要时都创建新的连接,从而提高性能并减少资源消耗。在给定的“DBConnectionPool.rar_...