配置文件:c3p0-config.xml

<!-- Hibernate官方推荐使用的数据库连接池即c3p0;dbcp是Tomcat在数据源中使用 -->
<c3p0-config>
    <default-config>
        <!-- 指定连接数据源的基本属性,注意属性名不能随便写 -->
        <property name="user">root</property>
        <property name="password">kk</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///test</property>
       
        <!-- 若数据库中连接数不足时,一次向数据库中服务器申请多少个连接 -->
        <property name="acquireIncrement">8</property>
        <!-- 初始化数据库连接池时的连接数量 -->
        <property name="initialPoolSize">9</property>
        <!-- 数据库连接池中的最小数据库连接数 -->
        <property name="minPoolSize">5</property>
        <!-- 数据库连接池中的最大数据库连接数 -->
        <property name="maxPoolSize">10</property>
       
        <!-- c3p0数据库连接池可以维护的Statement的个数 -->
        <property name="maxStatements">0</property>
        <!-- 每个链接同时可以使用的Statement对象的个数  -->
        <property name="maxStatementsPerConnection">5</property>
    </default-config>
</c3p0-config>

测试文件1:

/*
  * 1、创建c3p0-config.xml文件
  * 2、创建ComboPooledDataSource实例
  * 3、从DataSource实例获取数据库连接
  * */
 @Test
 public void testC3P0Config() throws SQLException{
  
    DataSource ds=new ComboPooledDataSource();
    System.out.println(ds.getConnection());
    ComboPooledDataSource cpds=(ComboPooledDataSource) ds;
    System.out.println(cpds.getAcquireIncrement());
 }

测试文件2:

@Test
 public void testC3P0() throws PropertyVetoException, SQLException {
  
    ComboPooledDataSource cpds=new ComboPooledDataSource();
    cpds.setDriverClass("com.mysql.jdbc.Driver");
    cpds.setJdbcUrl("jdbc:mysql:///test");
    cpds.setUser("root");
    cpds.setPassword("kk");
  
    System.out.println(cpds.getConnection());
 }

重构DAO文件:DAO.java

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/*
 * JDBC工具类
 * */
public class JDBCTools {

  // 提交事务
   public static void commit(Connection con) {

     if (con != null) {
         try {
            con.commit();
         } catch (SQLException e) {
            e.printStackTrace();
         }
      }
   }

   //回滚事务
   public static void rollback(Connection con) {

     if (con != null) {
         try {
            con.rollback();
         } catch (SQLException e) {
            e.printStackTrace();
         }
      }
   }
 
   //开始事务
   public static void beginTx(Connection con) {

    if (con != null) {
         try {
            con.setAutoCommit(false);
         } catch (SQLException e) {
            e.printStackTrace();
       }
    }
 }

/*
  * 执行SQL的方法 insert,update,delete
  */
 public static void update(String sql, Object... args) {

Connection conn = null;
  PreparedStatement ps = null;

try {
   /*
    * 1、获取Connection连接 2、获取Statement 3、SQL语句 4、关闭数据库连接
    *
    */
   conn = getConnection();
   ps = conn.prepareStatement(sql);

for (int i = 0; i < args.length; i++) {
    ps.setObject(i + 1, args[i]);
   }

ps.executeUpdate();

} catch (Exception e) {
   e.printStackTrace();
  } finally {
   release(null, ps, conn);
  }
 }

private static DataSource ds=null;
 //数据库连接池应该被初始化一次,比较耗时
 static{
  ds=new ComboPooledDataSource();
 }
 
 public static Connection getConnection() throws Exception {

return ds.getConnection();
 }

public static void release(ResultSet rs, Statement st, Connection conn) {

if (rs != null) {
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }

if (st != null) {
   try {
    st.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }

if (conn != null) {
   try {
    /*
     * 数据库连接池的Connection对象进行close时并不是真的进行关闭,
     * 而是将该数据库连接归还到数据库连接池
     * */
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }
}

<十四>JDBC_c3p0数据库连接池的更多相关文章

  1. JDBC(四)----数据库连接池

    ##  数据库连接池 *  概念:其实就是一个容器(集合) *  当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后会将连接对象归还给容 ...

  2. Java并发编程(十四)-- 线程池实现原理

    在上一章我们从宏观上介绍了ThreadPoolExecutor,本文将深入解析一下线程池的具体实现原理 原理解析 线程池状态 在ThreadPoolExecutor中定义了一个volatile变量,另 ...

  3. Java数据库连接池比较(c3p0,dbcp,proxool和BoneCP)

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp21 Java框架数据库连接池比较(c3p0,dbcp和proxool,Bo ...

  4. Flask 偏函数、g对象、flask-session、数据库连接池、信号、自制命令、flask-admin

    目录 一.偏函数 二.g对象 g对象和session的区别 三.flask-session 四.数据库连接池 pymsql链接数据库 数据库连接池版 utils/sql.py 五.信号 六.命令fla ...

  5. 你认为的.NET数据库连接池,真的是全部吗?

    一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象. DBA能在对业务方无侵 ...

  6. 十四 数据库连接池&DBUtils

    关于数据库连接池: 1 数据库的连接对象创建工作,比较消耗性能. 2 一开始在内存中开辟一块空间,往池子里放置多个连接对象,需要连接的时候从连接池里面调用, 使用完毕归还连接,确保连接对象能够循环利用 ...

  7. java web学习总结(十六) -------------------数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  8. javaweb学习总结(三十九)——数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  9. VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机

    VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...

随机推荐

  1. NetBeans invalid jdkhome specified 问题解决方法

    JDK的路径变化会导致 NetBeans 启动时出现错误: 解决办法: There's is an easy way to fix this. Navigate to your NetBeans in ...

  2. CentOS 安装Paramiko模块

    转自:http://www.cnblogs.com/hyli/p/3910585.html 1.下载安装包: https://pypi.python.org/packages/source/p/par ...

  3. STM32学习及应用笔记一:SysTick定时器学习及应用

    这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...

  4. 初识MVC

    本人是一个程序员,我也是一个很普通很普通的人,当我初学一些东西的时候感觉都很难,毕竟没有天才的头脑,没有高等的学历,但是我有的只是努力,只是拼搏的精神,人都是为自己而活,也可能为他人而活,但是有时候在 ...

  5. (转)springMVC+mybatis+ehcache详细配置

    一. Mybatis+Ehcache配置 为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方 ...

  6. 创建cocos项目并打包

  7. Mac OS X系统安装盘制作

    本文来记录一下制作苹果系统安装盘的步骤: 1. 准备一个空白的U盘或移动硬盘和去App Store下载好最新版本的系统,现在最新的是:macOS Sierra,下载后会默认打开安装进程,退出不管即可, ...

  8. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  9. 同一行多个div宽度自适应布局

    主要运用到的是:布局神器display:table-cell 元素两端对齐 第一个案例是让两个元素分别向左和向右对齐,如果是过去,我一定会用float来实现,但其实用table可以这么做: 自动平均划 ...

  10. sql中NVARCHAR(MAX) 性能和占空间分析 varchar(n),nvarchar(n) 长度性能及所占空间分析

    varchar(n),nvarchar(n) 中的n怎么解释: nvarchar(n)最多能存n个字符,不区分中英文. varchar(n)最多能存n个字节,一个中文是两个字节. 所占空间: nvar ...