通用数据库连接池-C3PO
C3PO是一个开放源代码的JDBC数据连接池实现项目,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。开源项目在使用:Hibernate,Spring,MYSQL等。
下载:
https://sourceforge.net/projects/c3p0/files/latest/download?source=files二进制包。
目录:

其中的doc为说明文档,examples是自带的例子,lib是一些jar包,src是源码jar包。
简单使用实例(配置Oracle数据源):
- import java.beans.PropertyVetoException;
- import java.sql.Connection;
- import java.sql.SQLException;
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- import com.mchange.v2.c3p0.DataSources;
- public class Test {
- public static void main(String[] args) {
- ComboPooledDataSource cpds = new ComboPooledDataSource();
- try {
- // 数据源进行各种有效的控制:
- // 设置驱动
- cpds.setDriverClass("oracle.jdbc.driver.OracleDriver");
- // 设置数据库URL
- cpds.setJdbcUrl("jdbc:oracle:thin:@10.2.4.77:1521:ORCL");
- // 设置用户名
- cpds.setUser("**********");
- // 设置密码
- cpds.setPassword("**********");
- // 当连接池中的连接用完时,C3PO一次性创建新的连接数目;
- cpds.setAcquireIncrement(3);
- // 定义在从数据库获取新的连接失败后重复尝试获取的次数,默认为30;
- cpds.setAcquireRetryAttempts(30);
- // 两次连接中间隔时间默认为1000毫秒
- cpds.setAcquireRetryDelay(1000);
- // 连接关闭时默认将所有未提交的操作回滚 默认为false;
- cpds.setAutoCommitOnClose(false);
- // 获取连接失败将会引起所有等待获取连接的线程异常,但是数据源仍有效的保留,并在下次调用getConnection()的时候继续尝试获取连接.如果设为true,那么尝试获取连接失败后该数据源将申明已经断开并永久关闭.默认为false
- cpds.setBreakAfterAcquireFailure(false);
- // 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待.单位毫秒,默认为0
- cpds.setCheckoutTimeout(0);
- // 隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查;
- cpds.setIdleConnectionTestPeriod(0);
- // 初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值.默认为3
- cpds.setInitialPoolSize(10);
- // 最大空闲时间,超过空闲时间的连接将被丢弃.为0或负数据则永不丢弃.默认为0;
- cpds.setMaxIdleTime(0);
- // 连接池中保留的最大连接数据.默认为15
- cpds.setMaxPoolSize(20);
- // JDBC的标准参数,用以控制数据源内加载的PreparedStatement数据.但由于预缓存的Statement属于单个Connection而不是整个连接池.所以设置这个参数需要考滤到多方面的因素,如果maxStatements
- // 与maxStatementsPerConnection均为0,则缓存被关闭.默认为0;
- cpds.setMaxStatements(0);
- // 连接池内单个连接所拥有的最大缓存被关闭.默认为0;
- cpds.setMaxStatementsPerConnection(0);
- // C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成.扩展这些操作可以有效的提升性能,通过多数程实现多个操作同时被执行.默为为3
- cpds.setNumHelperThreads(3);
- // 用户修改系统配置参数执行前最多等待的秒数.默认为300;
- cpds.setPropertyCycle(300);
- // 获取数据连接
- Connection conn = cpds.getConnection();
- if ( conn != null) {
- System.out.println("OK");
- // 关闭连接,当前连接被连接池收回
- conn.close();
- }
- } catch (PropertyVetoException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- //关闭数据连接池
- DataSources.destroy(cpds);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- }
注意除了导入c3p0-0.9.1.2.jar外还要导放log4j的包和数据库驱动包.
使用实例二:
将lib下的c3p0-0.9.5.2.jar和mchange-commons-java-0.2.11.jar导入eclipse中,并在工程的src下新建一个名为c3p0-config.xml,且内容为:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="mvcApp">
<propertyname="user">root</property>
<propertyname="password">123456</property>
<propertyname="driverClass">com.mysql.jdbc.Driver</property>
<propertyname="jdbcUrl">jdbc:mysql://localhost:3306/java</property>
<!—以上的user是数据库的用户,password是数据库的密码,driverClass是mysql的数据库驱动,jdbcUrl是连接数据库的url -->
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->
<propertyname="acquireIncrement">5</property>
<!--初始化时获取十个连接,取值应在minPoolSize与maxPoolSize之间 -->
<propertyname="initialPoolSize">10</property>
<!--连接池中保留的最小连接数 -->
<propertyname="minPoolSize">10</property>
<!--连接池中保留的最大连接数 -->
<propertyname="maxPoolSize">50</property>
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<propertyname="maxStatements">20</property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<propertyname="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
④在工程中新建一个JdbcUtils的工具类,代码如下:
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JdbcUtils {
/**
* 释放连接
* @param connection
*/
public staticvoid releaseConnection(Connection connection){
try {
if(connection != null ) {
connection.close();
}
}catch (Exception e) {
e.printStackTrace();
}
}
privatestatic DataSource dataSource = null;
static{
//dataSource资源只能初始化一次
dataSource= new ComboPooledDataSource("mvcApp");
}
/**
* 获取连接
* @return
* @throws SQLException
*/
public staticConnection getConnection() throws SQLException{
returndataSource.getConnection();
}
}
其中的mvcApp是c3p0-config.xml中named-config的name值。DataSource的实例使用ComboPooledDataSource来生成的,这样我们就可以创建一个连接池,从而减少数据库连接时间。
最后,c3p0相似的dbcp和proxool连接池,详见:
dbcp::http://baike.baidu.com/view/920072.htm
proxool:http://baike.baidu.com/view/2098784.htm
通用数据库连接池-C3PO的更多相关文章
- paip.提升性能----数据库连接池以及线程池以及对象池
paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax 艾龙, ...
- 数据库连接池 C3p0
数据库连接池 C3po 1 定义 本质上是个容器(集合) 存放数据库的连接容器(connection 对象) ,当系统初始化以后 容器就会创建 容器中就会申请一些连接对象 ,当用户来访问数据库的时候 ...
- C3PO数据库连接池
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 -<c3p0-config> 4 5 6 -& ...
- java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、
一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...
- Springboot数据库连接池报错的解决办法
Springboot数据库连接池报错的解决办法 这个异常通常在Linux服务器上会发生,原因是Linux系统会主动断开一个长时间没有通信的连接 那么我们的问题就是:数据库连接池长时间处于间歇状态,导致 ...
- 数据库连接池:Druid
转自: http://www.cnblogs.com/windlaughing/p/3287501.html Java连接数据库方法概述 java.sql提供了一些接口和类,用于支持数据库增删改查等相 ...
- 转!数据库连接池概念、种类、配置(DBCP\C3P0\JndI与Tomact配置连接池)
数据库连接池概念.种类.配置(DBCP\C3P0\JndI与Tomact配置连接池) 一.DBCP 连接:DBCP 连接池是 Apache 软件基金组织下的一个开源连接池实现. 需要的 java 包c ...
- JDBC基础学习(六)—数据库连接池
一.数据库连接池介绍 1.数据库连接池的缘由 对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什 ...
- Python实现Mysql数据库连接池
python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
随机推荐
- Android-JVM中的多线程&垃圾回收
Java语言是为数不多支持多线程技术的编程语言,而这多线程就不得不提到JVM虚拟机 先看代码案例:(JVM收垃圾) package android.java.thread; class Demo { ...
- FreeNas FTP配置
FTP服务器与客户端 因为拥有强大WebGUI管理界面,在FreeNAS中配置FTP服务变得非常简单.如果你是第一次接触FTP这一概念,那么首先要明白两个核心的概念. FTP服务器:你可以把它想象成一 ...
- CSharp程序员学Android开发---3.Android内部元素不填充BUG
最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...
- Ruby on Rails 目录结构
目录结构 + app/ #控制器.模型.视图.帮助方法.邮件.静态资源 + bin/ #rails脚本 + config/ #路由.数据库等 + db/ #数据库模式.迁移文件 + lib/ #扩展模 ...
- K8S+GitLab-自动化分布式部署ASP.NET Core(二) ASP.NET Core DevOps
一.介绍 前一篇,写的K8S部署环境的文章,简单的介绍下DevOps(Development和Operations的组合词),高效交付, 自动化流程,来减少软件开发人员和运维人员的沟通.Martin ...
- rabbitMQ的简单实例——amqp协议带数据回写机制
rabbitMQ是一种高性能的消息队列,支持或者说它实现了AMQP协议(advanced message queue protocol高级消息队列协议). 下面简单讲一讲一个小例子.我们首先要部署好r ...
- 再看javascript执行上下文、变量对象
突然看到一篇远在2010年的老文,作者以章节的形式向我们介绍了ECMA-262-3的部分内容,主要涉及到执行上下文.变量对象.作用域.this等语言细节.内容短小而精悍,文风直白而严谨,读完有酣畅淋漓 ...
- 为什么有监听socket和连接socket,为什么产生两个socket
为什么有监听socket和连接socket,为什么产生两个socket 先看一半的socket建立连接的双方的过程: 客户端: socket()---->创建出 active_socket_fd ...
- Swift 里集合类型协议的关系
  Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议,可以通过迭代来获取它的元素 ...
- 调用百度地图开发平台的JavascriptAPI实现将市县位置转换成坐标
最近的项目要做的地图比较多,有的还比较复杂,而地图用到的坐标,上网找json文件更是良莠不齐的.真是让人伤脑筋,后来突然想到了百度地图开发平台,没想到真的有对应的API哦,谢天谢地!!!下面说一下完整 ...