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">despairproperty> 6 <property name="password">123456property> 7 <property name="driverClass">oracle.jdbc.driver.OracleDriverproperty> 8 <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orclproperty> 9 10 11 <property name="acquireIncrement">2property> 12 13 <property name="initialPoolSize">5property> 14 15 <property name="minPoolSize">1property> 16 17 <property name="maxPoolSize">5property> 18 21 <property name="maxStatements">5property> 22 23 <property name="maxStatementsPerConnection">5property> 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的学习。。。。。。。