- 浏览: 774086 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
webcover:
最新的中文网络记事本: 破笔记
网络记事本:http://w ...
五个最佳的免费网络记事本 -
fred_nxh:
很好,长见识了
java中堆(heap)和堆栈(stack)有什么区别 -
efeige:
兄弟,请问一下,为什么我的2003系统 网站属性 里面没有“服 ...
启用IIS Gzip 页面压缩技术 加速网页的浏览速度 -
252401762:
同样的问题啊,不知道楼主是否已经转做售前了
售前和 开发的选择 -
yuan:
膜拜玩静电的现在呢?
来回顾一下,当年的“发烧史”吧:
Commons pool 数据库连接池实现 收藏
1,首先我们要实现一个工厂类,用于处理验证,创建对象等方法。
view plaincopy to clipboardprint?
package net.chinacsharp.jdf.pool.connectionpool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.pool.PoolableObjectFactory;
/**
* @author keyboardsun mail: keyboardsun@163.com
* @site http://www.chinacsharp.net
*/
public class SecObjectFactory implements PoolableObjectFactory {
// private ConnectionGetter connectionGetter = new ConnectionGetter();
// private String CONNECTION_NAME="Sec";
/**
* 这里,我们在使用对象的时候,需要首先激活这个对象,但是在多线程情况下,
* 这个对象已经被别的线程借去用了,那我们就要再建立一个对象。
*/
public void activateObject(Object arg0) throws Exception {
System.out.println("activateObject"+arg0);
}
/**
* 这里我们销毁这个对象。不用这个对象了,这个方法得在业务使用过程中主动调用。
* 在调用完这个方法过后,对象已经被销毁,但是在Object pool里面还是存在这个对象的
* 只是这个对象是null而已。所以在调用完destroyObject过后,要记得把pool清空一下。
*/
public void destroyObject(Object arg) throws Exception {
System.out.println("destroyObject:"+arg);
if(((Connection)arg).isClosed()!=true){
((Connection)arg).close();
}
}
/**
* 这里,在业务中第一次借对象的时候,这里要初始化一个,如果初始的都被借了,那就要继续初始
* 这里创建的对象将被存到pool里面
*/
public Object makeObject() throws Exception {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
conn.setAutoCommit(false);
// Object o = connectionGetter.getNewConnection(CONNECTION_NAME);
// System.out.println("makeObject:"+o);
return conn;
}
/**
* 这里,在我们使用完每个对象过后,要做的就是归还,在归还后就要调用这个方法。
* 简单的说,在还款凭证上面签个大名
*/
public void passivateObject(Object arg0) throws Exception {
System.out.println("passivateObject"+arg0);
}
/**
*这个方法是验证对象,这里我们不做处理,这里在借对象和还对象的时候都要验证下的。
*/
public boolean validateObject(Object arg) {
System.out.println("validateObject:"+arg);
try {
if(((Connection)arg).isClosed()==true){
return false;
} else {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
package net.chinacsharp.jdf.pool.connectionpool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.pool.PoolableObjectFactory;
/**
* @author keyboardsun mail: keyboardsun@163.com
* @site http://www.chinacsharp.net
*/
public class SecObjectFactory implements PoolableObjectFactory {
// private ConnectionGetter connectionGetter = new ConnectionGetter();
// private String CONNECTION_NAME="Sec";
/**
* 这里,我们在使用对象的时候,需要首先激活这个对象,但是在多线程情况下,
* 这个对象已经被别的线程借去用了,那我们就要再建立一个对象。
*/
public void activateObject(Object arg0) throws Exception {
System.out.println("activateObject"+arg0);
}
/**
* 这里我们销毁这个对象。不用这个对象了,这个方法得在业务使用过程中主动调用。
* 在调用完这个方法过后,对象已经被销毁,但是在Object pool里面还是存在这个对象的
* 只是这个对象是null而已。所以在调用完destroyObject过后,要记得把pool清空一下。
*/
public void destroyObject(Object arg) throws Exception {
System.out.println("destroyObject:"+arg);
if(((Connection)arg).isClosed()!=true){
((Connection)arg).close();
}
}
/**
* 这里,在业务中第一次借对象的时候,这里要初始化一个,如果初始的都被借了,那就要继续初始
* 这里创建的对象将被存到pool里面
*/
public Object makeObject() throws Exception {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "admin");
conn.setAutoCommit(false);
// Object o = connectionGetter.getNewConnection(CONNECTION_NAME);
// System.out.println("makeObject:"+o);
return conn;
}
/**
* 这里,在我们使用完每个对象过后,要做的就是归还,在归还后就要调用这个方法。
* 简单的说,在还款凭证上面签个大名
*/
public void passivateObject(Object arg0) throws Exception {
System.out.println("passivateObject"+arg0);
}
/**
*这个方法是验证对象,这里我们不做处理,这里在借对象和还对象的时候都要验证下的。
*/
public boolean validateObject(Object arg) {
System.out.println("validateObject:"+arg);
try {
if(((Connection)arg).isClosed()==true){
return false;
} else {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
2,我们要做一个pool 操作类
view plaincopy to clipboardprint?
package net.chinacsharp.jdf.pool.connectionpool;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool.Config;
public class SecObjectPool implements ObjectPool{
private static SecObjectFactory factory = new SecObjectFactory();
private static ObjectPool pool = null;
private static GenericObjectPool.Config config = null;
private static boolean initFlag = false;//是否初始化
static {
if(!initFlag){
config = new Config();
config.maxActive = 2; //这个属性没啥用
config.maxIdle = 5; //最大连接数,就这个有用.
config.minIdle = 3; //最少连接数 ,这个也没用,哈哈.
pool = new GenericObjectPool(factory,config);
initFlag = true;
}
}
public Object borrowObject() throws Exception {
return pool.borrowObject();
}
public void returnObject(Object arg0) throws Exception {
pool.returnObject(arg0);
}
public void invalidateObject(Object arg0) throws Exception {
pool.invalidateObject(arg0);
}
public void addObject() throws Exception {
pool.addObject();
}
public int getNumIdle() throws UnsupportedOperationException {
return pool.getNumIdle();
}
public int getNumActive() throws UnsupportedOperationException {
return pool.getNumActive();
}
public void clear() throws Exception, UnsupportedOperationException {
pool.clear();
}
public void close() throws Exception {
pool.close();
}
public void setFactory(PoolableObjectFactory arg0) throws IllegalStateException, UnsupportedOperationException {
pool.setFactory(arg0);
}
}
package net.chinacsharp.jdf.pool.connectionpool;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.pool.impl.StackObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool.Config;
public class SecObjectPool implements ObjectPool{
private static SecObjectFactory factory = new SecObjectFactory();
private static ObjectPool pool = null;
private static GenericObjectPool.Config config = null;
private static boolean initFlag = false;//是否初始化
static {
if(!initFlag){
config = new Config();
config.maxActive = 2; //这个属性没啥用
config.maxIdle = 5; //最大连接数,就这个有用.
config.minIdle = 3; //最少连接数 ,这个也没用,哈哈.
pool = new GenericObjectPool(factory,config);
initFlag = true;
}
}
public Object borrowObject() throws Exception {
return pool.borrowObject();
}
public void returnObject(Object arg0) throws Exception {
pool.returnObject(arg0);
}
public void invalidateObject(Object arg0) throws Exception {
pool.invalidateObject(arg0);
}
public void addObject() throws Exception {
pool.addObject();
}
public int getNumIdle() throws UnsupportedOperationException {
return pool.getNumIdle();
}
public int getNumActive() throws UnsupportedOperationException {
return pool.getNumActive();
}
public void clear() throws Exception, UnsupportedOperationException {
pool.clear();
}
public void close() throws Exception {
pool.close();
}
public void setFactory(PoolableObjectFactory arg0) throws IllegalStateException, UnsupportedOperationException {
pool.setFactory(arg0);
}
}
3,Main 函数
view plaincopy to clipboardprint?
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.chinacsharp.jdf.pool.connectionpool.*;
public class PoolTest {
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
SecObjectPool p = new SecObjectPool();
Connection connection = null;
try {
connection = (Connection) p.borrowObject();
PreparedStatement statement = null;
statement = connection.prepareStatement("SELECT * FROM PERSON");
ResultSet rs = statement.executeQuery();
rs.close();
System.out.println("================");
p.addObject();
System.out.println("使用中几个:"+p.getNumActive());
System.out.println("队列中还有:"+p.getNumIdle());
p.addObject();
p.addObject();
p.addObject();
p.addObject();
connection = (Connection) p.borrowObject();
connection = (Connection) p.borrowObject();
connection = (Connection) p.borrowObject();
p.addObject();
p.addObject();
p.addObject();
p.addObject();
System.out.println("使用中几个:"+p.getNumActive());
System.out.println("队列中还有:"+p.getNumIdle());
System.out.println("================");
p.returnObject(connection);
System.out.println("使用中几个:"+p.getNumActive());
System.out.println("队列中还有:"+p.getNumIdle());
System.out.println("=====clear===========");
p.clear();
System.out.println("=====close===========");
p.close();
} catch (Throwable e) {
e.printStackTrace();
connection.close();
}
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import net.chinacsharp.jdf.pool.connectionpool.*;
public class PoolTest {
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
SecObjectPool p = new SecObjectPool();
Connection connection = null;
try {
connection = (Connection) p.borrowObject();
PreparedStatement statement = null;
statement = connection.prepareStatement("SELECT * FROM PERSON");
ResultSet rs = statement.executeQuery();
rs.close();
System.out.println("================");
p.addObject();
System.out.println("使用中几个:"+p.getNumActive());
System.out.println("队列中还有:"+p.getNumIdle());
p.addObject();
p.addObject();
p.addObject();
p.addObject();
connection = (Connection) p.borrowObject();
connection = (Connection) p.borrowObject();
connection = (Connection) p.borrowObject();
p.addObject();
p.addObject();
p.addObject();
p.addObject();
System.out.println("使用中几个:"+p.getNumActive());
System.out.println("队列中还有:"+p.getNumIdle());
System.out.println("================");
p.returnObject(connection);
System.out.println("使用中几个:"+p.getNumActive());
System.out.println("队列中还有:"+p.getNumIdle());
System.out.println("=====clear===========");
p.clear();
System.out.println("=====close===========");
p.close();
} catch (Throwable e) {
e.printStackTrace();
connection.close();
}
}
}
4,输出结果
activateObjectcom.mysql.jdbc.Connection@147ee05
================
passivateObjectcom.mysql.jdbc.Connection@1960f05
使用中几个:1
队列中还有:1
passivateObjectcom.mysql.jdbc.Connection@1e04cbf
passivateObjectcom.mysql.jdbc.Connection@66e815
passivateObjectcom.mysql.jdbc.Connection@edc3a2
passivateObjectcom.mysql.jdbc.Connection@6e70c7
activateObjectcom.mysql.jdbc.Connection@1960f05
activateObjectcom.mysql.jdbc.Connection@1e04cbf
activateObjectcom.mysql.jdbc.Connection@66e815
passivateObjectcom.mysql.jdbc.Connection@1d63e39
passivateObjectcom.mysql.jdbc.Connection@d0a5d9
passivateObjectcom.mysql.jdbc.Connection@b8f82d
passivateObjectcom.mysql.jdbc.Connection@a6aeed
destroyObject:com.mysql.jdbc.Connection@a6aeed
使用中几个:4
队列中还有:5
================
passivateObjectcom.mysql.jdbc.Connection@66e815
destroyObject:com.mysql.jdbc.Connection@66e815
使用中几个:3
队列中还有:5
=====clear===========
destroyObject:com.mysql.jdbc.Connection@edc3a2
destroyObject:com.mysql.jdbc.Connection@6e70c7
destroyObject:com.mysql.jdbc.Connection@1d63e39
destroyObject:com.mysql.jdbc.Connection@d0a5d9
destroyObject:com.mysql.jdbc.Connection@b8f82d
=====close===========
通过以上结果我们可以发现,在连接池clear()的时候,调用 destroyObject 方法,我们这里把连接都关闭了
同样的道理,我们close()的时候也是如此。
而连接池的最大激活数目的设置是不起作用的,但是队列最多连接数那是有效果的,如果队列已经是最多了,它会把创建的或者归还的,调用 destroyObject 方法,释放对象。
原创作品,转载请标明出处
http://blog.csdn.net/keyboardsun
作者 keyboardsun
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/keyboardsun/archive/2009/06/17/4277592.aspx
发表评论
-
ocx插件插入网页实现自动更新与安装注册
2010-07-27 16:17 6670ocx插件插入网页实现 ... -
JIRA
2010-04-02 16:28 1221JIRA 百科名片 JIRA是集项目计划、任务分配、需求管 ... -
ArrayList和LinkedList的用法区别
2010-03-17 10:58 1955ArrayList和LinkedList的用法区别 (2 ... -
Java 中Vector、ArrayList和LinkedList 的区别时间
2010-03-17 10:25 1792Java 中Vector、ArrayList和LinkedLi ... -
多层架构的Web开发框架模型
2010-03-14 00:31 1969摘要:在经典的J2EE四层体系结构的基础上增加数据持久层,提出 ... -
Java语言编码规范(Java Code Conventions
2010-03-08 01:17 8561 介绍(Introduction)1.1 为什么要有编码规范 ... -
IT 的规划
2010-02-21 21:07 775本文说的这位网友,在I ... -
记忆学
2010-02-10 00:50 696http://bbs.jiyifa.cn/read.php?t ... -
java析构函数替代者finalize()解说
2010-01-21 22:18 2609java析构函数替代者finali ... -
Java的GC机制总结(0) ---finalize()方法
2010-01-21 22:00 1234其实了解JAVA的人,都知道JAVA的GC机制是其的一大优点, ... -
Java认证考试
2010-01-14 12:30 863Java认证考试 关于Java方面,Sun推出四项认证:Su ... -
集合框架
2010-01-13 23:24 673java 集合框架 对象的集合 如果程序的 ... -
Java集合框架使用总结
2010-01-13 21:31 675Java集合框架使用总结 ... -
关于JAVA中的线程安全
2010-01-13 10:34 1568关于JAVA中的线程安全 ... -
Java 理论与实践: 并发集合类
2010-01-13 01:27 868DougLea的 util.concurrent 包除了包含许 ... -
java main 主函数
2010-01-10 14:28 2350java主函数一般定义如下:public static ... -
java新式for循环
2009-12-29 15:51 811java新式for循环 2008-08-04 13:48:2 ... -
2009年的Java技术发展趋势展望
2009-11-08 21:28 773已经有14岁的Java在日新月异的IT技术领域内不算年轻,但它 ... -
MyEclipse要注册
2009-11-07 18:37 1702yEclipse怎么注册都不知道。我说他没有注册,他硬要说已经 ... -
浅谈设计模式在JAVA中的具体运用
2009-10-27 23:32 960浅谈设计模式在JAVA ...
相关推荐
再者,DBCP(BasicDataSource)是Apache Commons DBCP项目的一部分,它是基于Jakarta-Commons-Pool的数据库连接池实现。DBCP提供了基本的连接池功能,如连接池大小控制、空闲连接检测等。相对于C3P0和Druid,DBCP...
DBCP(Database Connection Pool)是Apache软件基金会的Commons DBCP项目提供的一款开源的数据库连接池组件。数据库连接池在Java应用中扮演着至关重要的角色,它通过维护一定数量的数据库连接,实现了数据库连接的...
总的来说,DBCP和Commons Pool是Java应用中实现数据库连接池的重要工具,它们能够有效地管理数据库连接,提升应用的并发性能和资源利用率。在实际开发中,正确配置和使用这两个组件对于优化数据库操作和提高应用整体...
本资源集合了常用的JDBC数据库连接jar包,以及一些知名的数据库连接池实现,如dbcp和c3p0,这对于开发人员来说是非常宝贵的资源。 首先,让我们了解一下JDBC。JDBC提供了一套标准的API,包括接口和类,使得开发者...
`commons-dbcp`(Database Connection Pool)是Apache的一个开源项目,它提供了一个基于Java的数据库连接池实现。Dbcp允许开发者在多线程环境中高效地管理数据库连接,避免了频繁创建和关闭数据库连接的开销。这个库...
本文将深入解析“ConnectionPool”(数据库连接池)的工作原理,常见实现及使用方法。 **一、数据库连接池的概念** 数据库连接池,简单来说,就是管理数据库连接的池化技术。它预先创建一定数量的数据库连接,当多...
### 数据库连接池的核心概念与实现 #### 一、数据库连接池基础 数据库连接池是一种用于提高数据库访问效率的技术,其基本思想是在程序启动时预创建一定数量的数据库连接,并将其存储在一个“缓冲池”中。当应用...
Apache Commons DBCP2 是一个基于 Apache Commons Pool2 和 Apache Commons Collections 的数据库连接池实现。它提供了基本的连接池功能,如连接创建、分配和回收,同时也具有一定的性能优化能力。DBCP2 支持 JDBC4...
本教程将深入探讨数据库连接池的原理,特别是针对C3P0和DBCP这两个常见的连接池实现。 首先,我们来看一下数据库连接池的基本概念。数据库连接池在初始化时会创建一定数量的数据库连接并保存在池中,当应用程序需要...
总的来说,DBCP2是一个适用于学习和小型项目的数据库连接池实现,对于初学者来说,通过这个压缩包可以了解数据库连接池的基本工作原理和使用方式,对于开发者而言,它可以提供基本的数据库连接管理功能,但可能需要...
在Java开发中,有三种常见的数据库连接池实现:DBCP(BasicDataSource)、C3P0以及阿里开源的Druid。下面将详细介绍这三种数据库连接池的实现原理和特性。 1. **DBCP (BasicDataSource)** DBCP 是 Apache Commons ...
总的来说,Apache Commons DBCP与其他两个库结合使用,为Java应用程序提供了高效且可靠的数据库连接池解决方案。了解并熟练使用这些jar包,能够帮助开发者优化数据库性能,提高系统稳定性和响应速度。在实际开发中,...
- `commons-dbcp-1.4.jar`:包含Apache DBCP库,用于数据库连接池的管理。 - `commons-pool-1.6.jar`:提供了通用对象池的功能,是DBCP的基础。 #### 三、关键类介绍 1. **BasicDataSource**:这是DBCP提供的核心类...
1. **DBCP(Apache Commons DBCP)**:这是一个Apache基金会下的开源连接池实现,依赖于Commons Pool库。DBCP常用于Tomcat等应用服务器,也可以单独在应用程序中使用。使用DBCP时,需要引入Commons-dbcp和Commons-...
在Web开发中,常见的数据库连接池实现有: 1. C3P0:这是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0提供了一套完善的配置参数,可以精细调整连接池的行为,如初始化和...
DBCP(Jakarta DBCP)是Apache软件基金会的一个开源项目,它基于Jakarta Commons库,为多种数据库提供了连接池实现。 在Java中,数据库连接通常通过JDBC(Java Database Connectivity)API来实现。JDBC允许Java程序...
根据给定的部分内容,我们可以看到一个简单的数据库连接池实现框架——`ConnectionPool`类。这个类包含了数据库连接的基本配置,如数据库驱动、URL、用户名、密码等,并提供了连接池的初始化大小、增量大小和最大...
1. **JdbcPool**:这是一个简单的自定义数据库连接池实现,通常用于教学或小型项目。它通过维护一个连接池,每当需要数据库连接时,就从池中获取,用完后归还。JdbcPool的基本思路是初始化时创建一定数量的数据库...
标题中提到的"各种数据库连接池",包括了c3p、DBCP和Proxool,这些都是Java环境下常见的数据库连接池实现: 1. **C3P0**:这是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。...