千家信息网

c3p0数据库连接池如何使用

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,这期内容当中小编将会给大家带来有关c3p0数据库连接池如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、jar包引用开源项目,自然要先下载人家的jar包,我
千家信息网最后更新 2025年01月25日c3p0数据库连接池如何使用

这期内容当中小编将会给大家带来有关c3p0数据库连接池如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、jar包

引用开源项目,自然要先下载人家的jar包,我这里有一个在云盘:c3p0-0.9.5-pre4.jar,这里面其实有三个包,是我在开源中国下载的最新的,如果你还想要更新的不妨自己到网上去搜一下。

二、配置文件

作为一个数据库连接池自然有很多参数要设置,当然就算你不设置也有默认的,不过那不一定能满足你的要求。这里的配置文件没有什么特别的要求,可以是xml也可以是properties甚至与txt都行,当然如果你愿意也可以写死在程序中。

下面是我的配置文件,我把它放在了src目录下,名字叫"c3p0.properties"

[java] view
plaincopy

  1. #jdbc基本信息

  2. driverClass=oracle.jdbc.driver.OracleDriver

  3. jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521/orcl

  4. user=bctts

  5. password=bctts123


  6. #c3p0连接池信息

  7. c3p0.minPoolSize=3

  8. c3p0.maxPoolSize=25


  9. #当连接池中的连接耗尽的时候c3p0一次同时获取的连接数

  10. c3p0.acquireIncrement=3

  11. #定义在从数据库获取新连接失败后重复尝试的次数

  12. c3p0.acquireRetryAttempts=60

  13. #两次连接中间隔时间,单位毫秒

  14. c3p0.acquireRetryDelay=1000

  15. #连接关闭时默认将所有未提交的操作回滚

  16. c3p0.autoCommitOnClose=false

  17. #当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒

  18. c3p0.checkoutTimeout=3000

  19. #每120秒检查所有连接池中的空闲连接。Default: 0

  20. c3p0.idleConnectionTestPeriod=120

  21. #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0

  22. c3p0.maxIdleTime=600

  23. #如果设为true那么在取得连接的同时将校验连接的有效性。Default: false

  24. c3p0.testConnectionOnCheckin=true

  25. #c3p0将建一张名为c3p0TestTable的空表,并使用其自带的查询语句进行测试。

  26. jdbc.automaticTestTable = c3p0TestTable


配置文件中的内容我就不解释了,相信你看一眼就能很明白。

三、代码实现

c3p0的使用非常简单,基本上就是三步搞定。

DataSource unPooled = DataSources.unpooledDataSource(url,jdbcproperties);//这里的第二个参数放的是连接数据库的信息,包括user、password等信息

DataSource ds = DataSources.pooledDataSource(unPooled,c3propertis);//这里面的第二个参数放的是c3p0连接池的配置信息

Connection conn = ds.getConnection();

这三句代码相信大家很容易看明白,也是使用c3p0连接池的核心代码,真的很简单。

下面是我写的例子,仅供参考

[java] view
plaincopy

  1. package com.bks.db;


  2. import java.io.FileInputStream;

  3. import java.sql.Connection;

  4. import java.sql.SQLException;

  5. import java.util.Properties;


  6. import javax.sql.DataSource;


  7. import com.mchange.v2.c3p0.DataSources;


  8. /**

  9. * c3p0连接池管理类

  10. * @author ICE

  11. *

  12. */

  13. public class C3P0ConnentionProvider {


  14. private static final String JDBC_DRIVER = "driverClass";

  15. private static final String JDBC_URL = "jdbcUrl";


  16. private static DataSource ds;

  17. /**

  18. * 初始化连接池代码块

  19. */

  20. static{

  21. initDBSource();

  22. }


  23. /**

  24. * 初始化c3p0连接池

  25. */

  26. private static final void initDBSource(){

  27. Properties c3p0Pro = new Properties();

  28. try {

  29. //加载配置文件

  30. c3p0Pro.load(new FileInputStream("./bin/c3p0.properties"));

  31. } catch (Exception e) {

  32. e.printStackTrace();

  33. }


  34. String drverClass = c3p0Pro.getProperty(JDBC_DRIVER);

  35. if(drverClass != null){

  36. try {

  37. //加载驱动类

  38. Class.forName(drverClass);

  39. } catch (ClassNotFoundException e) {

  40. e.printStackTrace();

  41. }


  42. }


  43. Properties jdbcpropes = new Properties();

  44. Properties c3propes = new Properties();

  45. for(Object key:c3p0Pro.keySet()){

  46. String skey = (String)key;

  47. if(skey.startsWith("c3p0.")){

  48. c3propes.put(skey, c3p0Pro.getProperty(skey));

  49. }else{

  50. jdbcpropes.put(skey, c3p0Pro.getProperty(skey));

  51. }

  52. }


  53. try {

  54. //建立连接池

  55. DataSource unPooled = DataSources.unpooledDataSource(c3p0Pro.getProperty(JDBC_URL),jdbcpropes);

  56. ds = DataSources.pooledDataSource(unPooled,c3propes);


  57. } catch (SQLException e) {

  58. e.printStackTrace();

  59. }

  60. }


  61. /**

  62. * 获取数据库连接对象

  63. * @return 数据连接对象

  64. * @throws SQLException

  65. */

  66. public static synchronized Connection getConnection() throws SQLException{

  67. final Connection conn = ds.getConnection();

  68. conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

  69. return conn;

  70. }

  71. }


下面这个是测试的例子

[java] view
plaincopy

  1. package test.demo;


  2. import java.sql.Connection;

  3. import java.sql.PreparedStatement;

  4. import java.sql.ResultSet;

  5. import java.sql.SQLException;


  6. import com.bks.db.C3P0ConnentionProvider;


  7. public class Demo {


  8. public static void main(String[] args) {

  9. for(int i=0;i<30;i++){

  10. new Thread(new Demo2()).start();

  11. }

  12. }


  13. }


  14. class Demo2 implements Runnable{


  15. public void run(){

  16. try {

  17. Connection conn = C3P0ConnentionProvider.getConnection();

  18. PreparedStatement pst = conn.prepareStatement("select to_char(sysdate,'hh34:mm:ss') tim from dual");

  19. ResultSet rs = pst.executeQuery();

  20. rs.next();

  21. System.out.println(Thread.currentThread().getName()+":"+rs.getString(1));

  22. try {

  23. Thread.sleep(10*1000);

  24. } catch (InterruptedException e) {

  25. e.printStackTrace();

  26. }


  27. } catch (SQLException e) {

  28. e.printStackTrace();

  29. }

  30. }

  31. }

上述就是小编为大家分享的c3p0数据库连接池如何使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

0