背景

一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接。因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化连接,随时取用,则平均每次取用只需要10-20毫秒。这在高并发随机访问数据库的时候对效率的提升有很大帮助。

C3P0连接池会根据你的配置来初始化N个数据库连接,空闲T时间后连接过期又会自动新建K个连接使得连接池总有空闲的数据库连接等待被取用。我们只需通过dataSourse.getConnection()即可从线程池中取用一个已经连接好的空闲连接,执行数据库操作。然后“断开”(放回)这个连接,把这个连接的使用权放回连接池。真正的数据库连接的创建与释放是由C3P0在后台自动完成的,我们花的只是取用与释放占用权的时间。全程耗时10+毫秒,比原来提高了几十倍


下载

c3p0下载地址:https://sourceforge.net/projects/c3p0/files/latest/download?source=files   下载完成后,将解压出来有3个jar包:

将这三个jar包导入项目中, 在src目录下新建一个名叫  c3p0-config.xml  的文件,注意,必须是这个文件名。


配置

c3p0-config.xml的示例代码如下图所示:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>  <!-- 默认配置 -->  <default-config>  <property name="initialPoolSize">10</property>  <property name="maxIdleTime">30</property>  <property name="maxPoolSize">100</property>  <property name="minPoolSize">10</property>  <property name="maxStatements">200</property>  </default-config>  <!-- 配置oracle连接池 -->  <named-config name="oracle">  <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>  <property name="jdbcUrl">jdbc:oracle:thin:@192.168.1.138:1521:ecology</property>  <property name="user">test1028</property>  <property name="password">test1028</property>  <property name="initialPoolSize">10</property>  <property name="maxIdleTime">30</property>  <property name="maxPoolSize">100</property>  <property name="minPoolSize">10</property>  <property name="maxStatements">200</property>  </named-config>  <!--配置连接池mysql--><named-config name="mysql">  <property name="driverClass">com.mysql.jdbc.Driver</property>  <property name="jdbcUrl">jdbc:mysql://192.168.1.123:3306/CoupleSpace</property>  <property name="user">root</property>  <property name="password">root</property>  <property name="initialPoolSize">10</property>  <property name="maxIdleTime">30</property>  <property name="maxPoolSize">100</property>  <property name="minPoolSize">10</property>  <property name="maxStatements">200</property>  </named-config> <!-- 配置其他连接池-->
</c3p0-config>

更细致的配置说明如下图所示:

<!--acquireIncrement:链接用完了自动增量3个。 --><property name="acquireIncrement">3</property><!--acquireRetryAttempts:链接失败后重新试30次。--><property name="acquireRetryAttempts">30</property><!--acquireRetryDelay;两次连接中间隔1000毫秒。 --><property name="acquireRetryDelay">1000</property><!--autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚。 --><property name="autoCommitOnClose">false</property><!--automaticTestTable:c3p0测试表,没什么用。--><property name="automaticTestTable">Test</property><!--breakAfterAcquireFailure:出错时不把正在提交的数据抛弃。--><property name="breakAfterAcquireFailure">false</property><!--checkoutTimeout:100毫秒后如果sql数据没有执行完将会报错,如果设置成0,那么将会无限的等待。 --> <property name="checkoutTimeout">100</property><!--connectionTesterClassName:通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--><property name="connectionTesterClassName"></property><!--factoryClassLocation:指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可。--><property name="factoryClassLocation">null</property><!--forceIgnoreUnresolvedTransactions:作者强烈建议不使用的一个属性。--> <property name="forceIgnoreUnresolvedTransactions">false</property><!--idleConnectionTestPeriod:每60秒检查所有连接池中的空闲连接。--> <property name="idleConnectionTestPeriod">60</property><!--initialPoolSize:初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。 --> <property name="initialPoolSize">3</property><!--maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。--><property name="maxIdleTime">60</property><!--maxPoolSize:连接池中保留的最大连接数。 --><property name="maxPoolSize">15</property><!--maxStatements:最大链接数。--><property name="maxStatements">100</property><!--maxStatementsPerConnection:定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0  --><property name="maxStatementsPerConnection"></property><!--numHelperThreads:异步操作,提升性能通过多线程实现多个操作同时被执行。Default: 3--> <property name="numHelperThreads">3</property><!--overrideDefaultUser:当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0的数据源时。Default: null--> <property name="overrideDefaultUser">root</property><!--overrideDefaultPassword:与overrideDefaultUser参数对应使用的一个参数。Default: null--><property name="overrideDefaultPassword">password</property><!--password:密码。Default: null--> <property name="password"></property><!--preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 测试的表必须在初始数据源的时候就存在。Default: null--><property name="preferredTestQuery">select id from test where id=1</property><!--propertyCycle:用户修改系统配置参数执行前最多等待300秒。Default: 300 --> <property name="propertyCycle">300</property><!--testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。Default: false --><property name="testConnectionOnCheckout">false</property><!--testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --><property name="testConnectionOnCheckin">true</property><!--user:用户名。Default: null--><property name="user">root</property><!--usesTraditionalReflectiveProxies:动态反射代理。Default: false--><property name="usesTraditionalReflectiveProxies">false</property>

使用方式

新建一个c3p0的工具类,如下图所示:


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0Util {    static ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");/*** 获取数据库连接* @return* @throws SQLException */public static Connection getConnection() throws SQLException{return dataSource.getConnection();}/*** 关闭数据库连接* @throws SQLException */public static void closeConnection(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) throws SQLException{if (connection!=null && !connection.isClosed()) {connection.close();}if (preparedStatement!=null && !preparedStatement.isClosed()) {preparedStatement.close();}if (resultSet != null && !resultSet.isClosed()) {resultSet.close();}}
}

在jdbc中使用c3p0工具类获得连接并查询数据:

 public ArrayList<Dept> queryDepts() throws SQLException{ArrayList<Dept> depts = new ArrayList<Dept>();try(Connection connection = C3P0Util.getConnection();PreparedStatement stmt=connection.prepareStatement("select * from ecology09171.bm");ResultSet rs=stmt.executeQuery();){while(rs.next()){Dept dept = new Dept();long id = rs.getLong("ID");String departmentName = rs.getString("DEPARTMENTNAME");long supDepID = rs.getLong("SUPDEPID");long subCompanyID1 = rs.getLong("SUBCOMPANYID1");String departmentMark = rs.getString("DEPARTMENTMARK");String canceled = rs.getString("CANCELED");dept.setID(id);dept.setSUPDEPID(supDepID);dept.setSUBCOMPANYID1(subCompanyID1);dept.setDEPARTMENTNAME(departmentName);dept.setDEPARTMENTMARK(departmentMark);dept.setCANCELED(canceled);depts.add(dept);}return depts;}}

c3p0连接池的配置和简单使用相关推荐

  1. C3P0连接池详细配置

    转自:http://blog.csdn.net/xiamizy/article/details/2030214 <c3p0-config> <default-config> & ...

  2. (十二)C3P0连接池使用教程

    一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接.因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉.而每次新建连接都 ...

  3. 【知了堂学习笔记】数据库连接池简介,以及Eclipse中C3p0连接池的简单运用

    1.普通的JDBC连接数据库的弊端 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0 ...

  4. Mysql超时重连解决方案3: 配置c3p0连接池(终极方案)

    前面的文章中,我介绍了修改mysql默认超时时间和配置proxool连接池的方法来解决Mysql超时重连的问题.方案1不推荐,它并没有从根本上解决问题:方案2可用,但配置相对复杂:所有才有了方案3,它 ...

  5. c3p0和jdbctemplate配置oracle集群rac,C3P0连接池、DRUID连接池和JdbcTemplate

    目录 一.C3P0连接池 1.C3P0连接池简介 2.常用的配置参数 3.C3P0连接池基本使用 (1)C3P0配置文件 (2)API介绍 4.使用步骤 二.DRUID连接池 1. DRUID简介 2 ...

  6. Spring+Hibernate+c3p0连接池配置-连接无法释放的问题解决方案

     1.Spring+Hibernate+c3p0连接池配置: <?xml version="1.0" encoding="UTF-8"?> < ...

  7. spring配置c3p0连接池、spring的声明式事务管理

    一.spring配置c3p0连接池: 1.导入maven依赖: <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> & ...

  8. Hibernate配置C3P0连接池(在配好基本的hibernate配置下使用)

    拷贝jar包 找到我们的hibernate安装包,在lib目录下找到optional目录,打开c3p0文件,拷贝里面的jar包到eclipse里 写一个测试类,代码入下 public class C3 ...

  9. Hibernate C3P0连接池配置

    本文向大家介绍Hibernate C3P0连接池,可能好多人还不了解Hibernate C3P0连接池,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西. Hibernate自带的连接池算 ...

最新文章

  1. 使用相机暗箱公式和透镜方程估计人脸距离
  2. 【PL/SQL】学习笔记 (9)例外之 no_data_found
  3. SAP ABAP实用技巧介绍系列之could not create BAdI implementation
  4. Create view failed with ORA-01031:insufficient privileges
  5. java 内部接口 内部类_Java的接口中中添加内部类,甚至实现外围接口的内部类,意义是什么?...
  6. 怎样挖掘搜索关键词?
  7. 抗议浪潮不断,峰会笑声阵阵
  8. free-mybatis-plugin插件下载
  9. 《自控力》读书笔记及实践
  10. 研究将有pid和id的ListMapString,Map组成树
  11. 四年程序员的常用工具清单
  12. 【报告分享】小红书·新消费浪潮下的决策价值之地-小红书(附下载)
  13. 计算机无法识别3.0u盘启动,USB3.0接口不能识别U盘怎么办
  14. 外貌测试软件准确吗,相貌测试(史上最准的颜值测试)
  15. python 发送QQ邮箱
  16. Mac 如何在终端打开文件.md
  17. 搜狗站群之搜狗泛目录实现搜狗大量泛收录
  18. 2021年广西省安全员B证找解析及广西省安全员B证模拟考试
  19. 音频和视频批量合并,及格式转换
  20. html 高度塌陷,前端高度塌陷问题

热门文章

  1. 我的女朋友漏电了–论C++中的失败(failure),缺陷(bug)和异常(exception)
  2. Kafka.net使用编程入门(一)
  3. 易飞扬宣布完成100G CWDM4PSM4光模块量产线建设
  4. 使用mysqladmin命令修改MySQL密码与忘记密码
  5. 谈谈重载(overload)覆盖(override)与隐藏
  6. 仿新浪微博滚动,无文字渐显功能
  7. MyBatis 数据持久层
  8. vfp : 顶层表单附加菜单
  9. Linux启动或重启网卡【命令】
  10. opencv android jni,OpenCV - AndroidStudio的JNI工程及引用OpenCV