一、数据库连接池介绍

1.数据库连接池的缘由

     对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销。但是对于一个复杂的数据库应用,情况就完全不同了。频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。

     连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

     对于共享资源,有一个很著名的设计模式:资源池。该模式正是为了解决资源频繁分配、释放所造成的问题的。把该模式应用到数据库连接管理领域,就是建立一个数据库连接池,提供一套高效的连接分配、使用策略,最终目标是实现连接的高效、安全的复用。

 

2.数据库连接池的原理

     连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

    

 

3.数据库连接池的优点

(1)资源重用

     由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

(2)更快的系统响应速度

     数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

(3) 统一的连接管理,避免数据库连接泄漏

     在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

 

二、C3P0连接池

     JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
     (1)DBCP 数据库连接池
     (2)C3P0 数据库连接池

     现在由于用的最多的是C3P0连接池,下面几介绍它的配置了。

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

	<!-- 指定连接数据源的基本属性 -->
<named-config name="c3p0test">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 若数据库连接数不足时,一次向服务器申请的连接数 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">10</property>
<!-- 数据库连接池中最小的连接数 -->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中最大的连接数 -->
<property name="maxPoolSize">20</property>
<!-- 数据库连接池可以维护的Statement的个数 -->
<property name="maxStatements">20</property>
<!-- 每个连接同时可以使用的Statement对象的个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config> </c3p0-config>

JDBCTools.java

public class JdbcTools{

	private static ComboPooledDataSource dataSource;

    private JdbcTools(){

    }

    static{
try{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
throw new ExceptionInInitializerError(e);
}
} /*
* 初始化数据库连接池
*/
static{
dataSource = new ComboPooledDataSource("c3p0test");
} /*
* 获取连接
*/
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
} /*
* 释放资源
*/
public static void releaseResource(Connection con,Statement st,ResultSet rs){
try{
if(rs != null){
rs.close();
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(st != null){
try{
st.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}finally{
if(con != null){
try{
//数据库连接才Connection对象进行关闭,并不是真的关闭。
//而是归还到了数据库连接词中
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
} /*
* 通用的增删改方法
* 执行SQL语句,使用PreparedStatemnt
* @param sql 带占位符的sql语句
* @param args 填写SQL占位符的可变参数
*/
public static void update(String sql,Object...args){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null; try{
con = JdbcTools.getConnection();
ps = con.prepareStatement(sql); for(int i = 0;i < args.length;i++){
ps.setObject(i + 1,args[i]);
} ps.execute(); }catch (Exception e) {
e.printStackTrace();
}
finally{
JdbcTools.releaseResource(con,ps,rs);
}
} public static void update(Connection con,String sql,Object...args){
PreparedStatement ps = null;
ResultSet rs = null; try{
ps = con.prepareStatement(sql); for(int i = 0;i < args.length;i++){
ps.setObject(i + 1,args[i]);
} ps.execute(); }catch (Exception e) {
e.printStackTrace();
}
finally{
JdbcTools.releaseResource(null,ps,rs);
}
} /*
* 开启事务
*/
public static void beginTx(Connection con){
if(con != null){
try{
con.setAutoCommit(false);
}catch(SQLException e){
e.printStackTrace();
}
}
} /*
* 提交事务
*/
public static void commitTx(Connection con){
if(con != null){
try{
con.commit();
}catch(SQLException e){
e.printStackTrace();
}
}
} /*
* 回滚事务
*/
public static void rollBackTx(Connection con){
if(con != null){
try{
con.rollback();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}

JDBC基础学习(六)—数据库连接池的更多相关文章

  1. JDBC(11)—数据库连接池

    在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接.而连接并打开数据库是一件既消费资源又费时的 ...

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

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

  3. JDBC(三)数据库连接池(DBCP、C3P0)

    前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...

  4. JDBC02 利用JDBC连接数据库【使用数据库连接池】

    目录 1/2/3  Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...

  5. mybatis学习三 数据库连接池技术

    1.在内存中开辟一块空间,存放多个数据库连接对象.就是Connection的多个实例2. 连接池技术有很多,c3p0,dbcp,druid,以及JDBC Tomcat Pool, JDBC Tomca ...

  6. javaweb基础(39)_数据库连接池

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

  7. Java学习:数据库连接池技术

    本节内容 数据库连接池 Spring JDBC : JDBC Template 数据库连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器 当系统初始化好后,容器中会申请一些连接对象,当用 ...

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

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

  9. python 基础 9.5 数据库连接池

      一. 数据库连接池    python 编程中可以使用MySQLdb 进行数据库的连接及诸如查询,插入,更新等操作,但是每次连接mysql 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...

随机推荐

  1. C# winform程序免安装.net framework在XP/win7/win10环境运行!

    前文: 首先感谢群里的大神宇内流云 提供的anyexec for windows版本. 经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后,测试通过,如下是用的xp运行winfr ...

  2. ConcurrentHashMap源码分析

    看过hashMap源码之后一直意犹未尽的感觉,挡不住我看其他的源码了.HashMap在单线程中非常好用,也不会出现什么问题,但是一到多线程就gg了,变的不灵了.我们有HashTable可以运用在多线程 ...

  3. 打造“黑客“手机--Kali Nethunter

    从三月份开始,继续更新技术文章.一个月没有更新技术文章了,这一个月有一部分时间是在休息,另一部分时间是在学习汇编和操作系统,沉淀底层和逆向方面的技术. 今年年初,为了玩一下 kali NetHunte ...

  4. Redis简单配置和使用

    学到Redis中需要整理和配置的东西比较多,资源也是比较分散!这次的主要还是将知识整合一下,开发过程中所需要的资源整合一下,也方便今后涉及到这块地方的知识时,将时间大量浪费在了找这些资源上了! 一.R ...

  5. 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载

    最近公司的app上线了,在推广APP的时候出现了一个问题,因为Android和IOS的下载地址不一样,那么在推广的时候就要推广两个二维码,这样比较麻烦,如何简化我们的推广,让IOS用户扫描二维码的时候 ...

  6. 香港多IP站群服务器-搭建多IP代理服务器、游戏加速服务器

    耀磊花楹qq82521463香港WK自营机房多IP服务器租用,多IP站群服务器,多IP多C段 站群服务器租用 耀磊数据拥有3万个自由香港IP以及独立AS号,是APNIC核心成员,机房通过BGP融合 多 ...

  7. UIImagePickerController拍照/相册/录像/本地视频

    1.导入系统库 #import <MobileCoreServices/MobileCoreServices.h> 2.遵守协议 <UIImagePickerControllerDe ...

  8. 2017年最新chrome必备插件推荐

    1. 上网必备 Speed dial plus新标签页, 直接替换掉chrome自带的毫无新意的新标签页,简洁优美快速,我本人非常喜欢. &amp;lt;img src="https ...

  9. 剑指offer_(4)

    重建二叉树: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍 ...

  10. 九度OJ题目1076:N的阶乘 (java)运用BigInteger的例子。

    题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 样例输入: 4 5 15 样例输出: ...