c3p0数据库连接池介绍+实例
2016-02-29 13:35
281 查看
1.背景
数据库连接的设计上有三种思路,第一是对于每一个用户都创建一个连接,等到该用户访问完就将数据库连接释放。第二种是设置一个静态连接变量,所有用户都使用该连接。第三种就是使用数据库连接池。2.原理
在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。3.工具选择
JDBC数据库连接池的实现必须实现javax.sql.DataSource接口,其中DataSource称为数据源,该数据源的实现有以下三种:C3p0:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate,Spring等。c3p0有自动回收空闲连接功能。
DBCP:是Apache上的一个 java连接池项目,也是 tomcat使用的连接池组件。单独使用dbcp需要3个包:
common-dbcp.jar,
common-pool.jar,
common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。dbcp没有自动的去回收空闲连接的功能。
Proxool:Proxool是一种Java数据库连接池技术,是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
对比结果:
性能
dbcp<=c3p0<proxool
稳定性
dbcp>=c3p0>proxool
4.c3p0代码实现
准备
a)下载jar包,总共需要两个包,c3p0-0.9.1.2.jar和mysql-connector-java-5.0.4-bin.jarb)创建工程将两个jar包导入,然后创建属性文件c3p0.properties(只能是这样的名字)
c)配置好c3p0.properties,其内容如下:
c3p0.driverClass=com.mysql.jdbc.Driver c3p0.jdbcUrl=jdbc:mysql://10.1.40.61:3306/test_bid_system?useUnicode=true&characterEncoding=utf8 c3p0.user=root c3p0.password=root c3p0.initialPoolSize=3 c3p0.minPoolSize=3 c3p0.maxPoolSize=15 c3p0.acquireIncrement=3 c3p0.maxIdleTime=1000 c3p0.acquireRetryAttempts=30 c3p0.acquireRetryDelay=1000
编码
a)创建连接池类ConnectionPool.javapublic class ConnectionPool { private static ComboPooledDataSource ds; private static ConnectionPool pool; //私有的构造函数 private ConnectionPool(){ ds = new ComboPooledDataSource(); } public static final ConnectionPool getInstance(){ if(pool == null){ pool = new ConnectionPool(); } return pool; } //获取连接池中的连接 public synchronized final Connection getConnection(){ try { Connection conn = ds.getConnection(); return conn; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
b)创建测试类Test.java
public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ConnectionPool pool = ConnectionPool.getInstance(); Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = pool.getConnection(); ps = conn.prepareStatement("select * from bms_weekreport"); rs = ps.executeQuery(); rs.next(); System.out.println("userId:"+rs.getString("userId")); System.out.println("使用线程池连接数据库!"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { rs.close(); ps.close(); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
运行结果
5.结束
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 第三章 数据库备份和还原
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle数据库执行脚本常用命令小结
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马