码迷,mamicode.com
首页 > 其他好文 > 详细

c3p0连接池的学习

时间:2017-11-16 22:06:09      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:使用   下载   config   之间   query   rman   最小   程序   用户名   

c3p0的学习 学习 学习 !

     首先c3p0的基本了解,在之前的web项目学习中都是直接使用jdbc的 DriverManager进行oracle数据库的连接,每次执行操作都会建立一个新的连接,在操作完成后,通过判断释放连接,但是如果处于高并发的情况下,就可能会造成服务器崩溃的后果,因为大量的资源同一时间得不到释放;以上是我自己对普通连接的学习和看法,采用c3p0连接池后,连接池会控制连接池内的连接对象数,以下是c3p0的xml配置文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE xml>
 3 <c3p0-config>
 4     <named-config name="mvcApp">
 5         <property name="user">despair</property>
 6         <property name="password">123456</property>
 7         <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
 8         <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
 9         <!-- user:用户名,password:密码,driverClass为ORACLE数据库驱动,jdbcUrl是连接数据库的URL -->
10         <!--连接池中的连接耗尽时c3p0再次获取的连接数目 -->
11         <property name="acquireIncrement">2</property>
12         <!--初始化时连接池存在的连接数,取值应在minPoolSize与maxPoolSize之间 -->
13         <property name="initialPoolSize">5</property>
14         <!--连接池中最小连接数 -->
15         <property name="minPoolSize">1</property>
16         <!--连接池中最大连接数 -->
17         <property name="maxPoolSize">5</property>
18         <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。
19         但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
20         如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。默认为0 -->
21         <property name="maxStatements">5</property>
22         <!--maxStatementsPerConnection 连接池内单个连接所拥有的最大缓存statements数。默认为0 -->
23         <property name="maxStatementsPerConnection">5</property>
24     </named-config>
25 </c3p0-config>

 

     从上面的配置文件中基本就可以了解c3p0是个什么东东了,简而言之,c3p0连接池不管是否有连接请求,先在连接池中建立几个连接对象即初始化条数,当有连接请求时,直接分配,如果经过多次创建新的连接对象且连接数已经达到最大值时,仍有请求进入的话,新的请求将需要等待,另外请求的对象可以重复使用这个连接对象。

     然后,我就开始了c3p0的简单代码学习:

     使用c3p0需要到c3p0官网下载需要的jar包

技术分享

 第一个和第三个,第三个是为了获得datasourse,即连接池。

还可以加入

技术分享

commons-dbutils 是 Apache提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

新建一个emp员工类

 1 import java.util.UUID;
 2 /**
 3  * 员工
 4  * @author 27533
 5  */
 6 public class Emp {
 7     private String id;//编号
 8     private String username;//姓名
 9     private double salary;//薪水
10     public Emp() {}
11     public Emp(String username,double salary){
12         this.username=username;
13         this.salary=salary;
14     }
15     public String getId() {
16         return UUID.randomUUID().toString();
17     }
18     public void setId(String id) {
19         this.id = id;
20     }
21     public String getUsername() {
22         return username;
23     }
24     public void setUsername(String username) {
25         this.username = username;
26     }
27     public double getSalary() {
28         return salary;
29     }
30     public void setSalary(double salary) {
31         this.salary = salary;
32     }
33     @Override
34     public String toString() {
35         // TODO Auto-generated method stub
36         return "id为"+id+" username为"+username+" salary为"+salary;
37     }
38 }

 

然后是工具类

 1 import com.mchange.v2.c3p0.ComboPooledDataSource;
 2 /**
 3  * 工具类
 4  * @author 27533
 5  */
 6 public class JDBCUtil {
 7     private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
 8     public static ComboPooledDataSource getdaDataSource() {
 9         return dataSource;
10     }
11 }

 

 然后是dao类

 1 import org.apache.commons.dbutils.QueryRunner;
 2 /**
 3  * 员工管理中的持久层
 4  * @author 27533
 5  */
 6 public class EmpDao {
 7 /**
 8  * 增加员工
 9  */
10     public void add(Emp emp)throws Exception{
11         QueryRunner runner = new QueryRunner(JDBCUtil.getdaDataSource());
12         String sql = "insert into emps(id,username,salary) values(?,?,?)";
13         Object[] params = {emp.getId(),emp.getUsername(),emp.getSalary()};
14         runner.update(sql, params);    
15     }    
16     /**
17      * 测试
18      * @throws Exception
19      */
20     public static void main(String[] args) throws Exception{
21         EmpDao e = new EmpDao();
22         e.add(new Emp("张三",10.3D));
23     }
24 }

      很不幸,第一次出现了问题,

警告: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@5c849077 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 

中文大概是:
警告:COM.mchange.V2.资源池.basicresourcepool $ scatteredacquiretask @ 5c849077 --获取尝试失败!!!清算等待取得。在试图获取所需的新资源时,我们未能成功地超过允许的最大尝试次数(30)。最后一次尝试尝试异常:

 正在解决。。。

 基本原理就是这样 。解决之后补充,以上就是c3p0的学习。。。。。。。

c3p0连接池的学习

标签:使用   下载   config   之间   query   rman   最小   程序   用户名   

原文地址:http://www.cnblogs.com/YsirSun/p/7821516.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!