c3p0数据库连接池如何使用

61次阅读
没有评论

共计 4013 个字符,预计需要花费 11 分钟才能阅读完成。

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

一、jar 包

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

二、配置文件

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

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

[java] view
plaincopy

#jdbc 基本信息  

driver >

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

user=bctts 

password=bctts123 

#c3p0 连接池信息  

c3p0.minPoolSize=3

c3p0.maxPoolSize=25

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

c3p0.acquireIncrement=3

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

c3p0.acquireRetryAttempts=60

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

c3p0.acquireRetryDelay=1000

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

c3p0.autoCommitOnClose=false

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

c3p0.checkoutTimeout=3000

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

c3p0.idleConnectionTestPeriod=120

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

c3p0.maxIdleTime=600

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

c3p0.testConnectionOnCheckin=true

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

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

package com.bks.db; 

import java.io.FileInputStream; 

import java.sql.Connection; 

import java.sql.SQLException; 

import java.util.Properties; 

import javax.sql.DataSource; 

import com.mchange.v2.c3p0.DataSources; 

/**

 * c3p0 连接池管理类

 * @author ICE

 *

 */

public class C3P0ConnentionProvider { 

 private static final String JDBC_DRIVER =  driverClass ; 

 private static final String JDBC_URL =  jdbcUrl ; 

 private static DataSource ds; 

 /**

 *  初始化连接池代码块

 */

 static{ 

 initDBSource(); 

 } 

 /**

 *  初始化 c3p0 连接池

 */

 private static final void initDBSource(){ 

 Properties c3p0Pro = new Properties(); 

 try { 

 // 加载配置文件

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

 } catch (Exception e) { 

 e.printStackTrace(); 

 } 

 String drverClass = c3p0Pro.getProperty(JDBC_DRIVER); 

 if(drverClass != null){ 

 try { 

 // 加载驱动类

 Class.forName(drverClass); 

 } catch (ClassNotFoundException e) { 

 e.printStackTrace(); 

 } 

 } 

 Properties jdbcpropes = new Properties(); 

 Properties c3propes = new Properties(); 

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

 String skey = (String)key; 

 if(skey.startsWith( c3p0.)){ 

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

 }else{ 

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

 } 

 } 

 try { 

 // 建立连接池

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

 ds = DataSources.pooledDataSource(unPooled,c3propes); 

 } catch (SQLException e) { 

 e.printStackTrace(); 

 } 

 } 

 /**

 *  获取数据库连接对象

 * @return  数据连接对象

 * @throws SQLException 

 */

 public static synchronized Connection getConnection() throws SQLException{ 

 final Connection conn = ds.getConnection(); 

 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); 

 return conn; 

 } 

下面这个是测试的例子

[java] view
plaincopy

package test.demo; 

import java.sql.Connection; 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import java.sql.SQLException; 

import com.bks.db.C3P0ConnentionProvider; 

public class Demo { 

 public static void main(String[] args) { 

 for(int i=0;i 30;i++){ 

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

 } 

 } 

class Demo2 implements Runnable{ 

 public void run(){ 

 try { 

 Connection conn = C3P0ConnentionProvider.getConnection(); 

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

 ResultSet rs = pst.executeQuery(); 

 rs.next(); 

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

 try { 

 Thread.sleep(10*1000); 

 } catch (InterruptedException e) { 

 e.printStackTrace(); 

 } 

 } catch (SQLException e) { 

 e.printStackTrace(); 

 } 

 } 

}  

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计4013字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)