1.传统链接(如下为示意图)

注意:

(1).传统方式找DriverManager要连接,数目是有限的。

(2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行

(3).项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式。

2.采用连接池(示意图)

3.开源数据库连接池

(1).现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
(2).也有一些开源组织提供了数据源的独立实现:
DBCP 数据库连接池(tomcat)
C3P0 数据库连接池(hibernate)
(3).实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

4.C3P0的使用:
(1).在classpath的路径下配置xml文件,即src的文件下而且这个文件名必须是c3p0-config.xml

原始的c3p0-config.xml的文件参数:

<c3p0-config>
<default-config>
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">3</property> <!-- 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts">30</property> <!-- 两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay">1000</property> <!-- 连接关闭时默认将所有未提交的操作回滚。Default: false -->
<property name="autoCommitOnClose">false</property> <!--
c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default:
null
-->
<property name="automaticTestTable">Test</property> <!--
获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false
-->
<property name="breakAfterAcquireFailure">false</property> <!--
当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出
SQLException,如设为0则无限期等待。单位毫秒。Default: 0
-->
<property name="checkoutTimeout">100</property> <!--
通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 Default:
com.mchange.v2.c3p0.impl.DefaultConnectionTester
-->
<property name="connectionTesterClassName"></property> <!--
指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 Default: null
-->
<property name="factoryClassLocation">null</property> <!--
Strongly disrecommended. Setting this to true may lead to subtle and
bizarre bugs. (文档原文)作者强烈建议不使用的一个属性
-->
<property name="forceIgnoreUnresolvedTransactions">false</property> <!-- 每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property> <!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize">3</property> <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">60</property> <!-- 连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">15</property> <!--
JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
-->
<property name="maxStatements">100</property> <!--
maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0
-->
<property name="maxStatementsPerConnection"></property> <!--
c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
通过多线程实现多个操作同时被执行。Default: 3
-->
<property name="numHelperThreads">3</property> <!--
当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 的数据源时。Default:
null
-->
<property name="overrideDefaultUser">root</property> <!-- 与overrideDefaultUser参数对应使用的一个参数。Default: null-->
<property name="overrideDefaultPassword">password</property> <!-- 密码。Default: null-->
<property name="password"></property> <!--
定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:
测试的表必须在初始数据源的时候就存在。Default: null
-->
<property name="preferredTestQuery">select id from test where id=1
</property> <!-- 用户修改系统配置参数执行前最多等待300秒。Default: 300 -->
<property name="propertyCycle">300</property> <!--
因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false
-->
<property name="testConnectionOnCheckout">false</property> <!-- 如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
<property name="testConnectionOnCheckin">true</property> <!-- 用户名。Default: null-->
<property name="user">root</property> <!--
早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到支持,但今后可能的版本可能不支持动态反射代理。Default:
false。
-->
<property name="usesTraditionalReflectiveProxies">false</property>
<property name="automaticTestTable">con_test</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">25</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">0</property>
<user-overrides user="swaldman">
</user-overrides>
</default-config>
<named-config name="dumbTestConfig">
<property name="maxStatements">200</property>
<user-overrides user="poop">
<property name="maxStatements">300</property>
</user-overrides>
</named-config>
</c3p0-config>

实战练习:
1>.首先配置c3p0-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">wwh</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/jdbctest</property>
</default-config>
</c3p0-config>

2>.代码操作连接(TestC3P0.java)

package cn.wwh.www.java.jdbc.datasource;

import java.sql.Connection;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
*类的作用:
*
*
*@author 一叶扁舟
*@version 1.0
*@创建时间: 2014-9-2 上午12:02:13
*/ //测试连接池C3P0的用法
public class TestC3P0 {
public static void main(String[] args) throws Exception {
long begin = System.currentTimeMillis();
//创建C3P0连接池,并加载c3p0-config.xml文件
ComboPooledDataSource dataSource = new ComboPooledDataSource();
for(int i=1;i<=1000000;i++){
Connection conn = dataSource.getConnection();
if(conn!=null){
System.out.println("获取连接第"+i+"个");
conn.close();
}
}
long end = System.currentTimeMillis();
System.out.println("用了" + (end-begin)/1000+"秒");
}
}

5.DBCP的使用:
(1).采用类加载的方式,文件名是:dbcp.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/jdbctest
username=root
password=wwh

(2).在代码中使用(TestDBCP.java)

package cn.wwh.www.java.jdbc.datasource;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; /**
*类的作用:采用DBCP连接池的方式去获取数据库的链接,并测试他的时间
*
*
*@author 一叶扁舟
*@version 1.0
*@创建时间: 2014-9-1 下午09:27:59
*/ //测试连接池DBCP的用法
public class TestDBCP {
public static void main(String[] args) throws Exception {
long begin = System.currentTimeMillis();
//加载属性文件
InputStream is = TestDBCP.class.getClassLoader().getResourceAsStream("cn/wwh/www/java/jdbc/config/dbcp.properties");
Properties props = new Properties();
props.load(is);
//创建DBCP连接池工厂
BasicDataSourceFactory factory = new BasicDataSourceFactory();
//创建数据源,即连接池
DataSource ds = factory.createDataSource(props);
for(int i=1;i<=1000000;i++){
//从连接池中取得一个空闲的连接对象
Connection conn = ds.getConnection();
if(conn!=null){
System.out.println("获取连接第"+i+"个");
}
//将连接对象还回给连接池
conn.close();
}
long end = System.currentTimeMillis();
System.out.println("用了" + (end-begin)/1000+"秒");
}
}

第一的测试时间为18秒,第二个的测试时间为13秒,不同的机器性能不一样,测试的时间快慢也不可能。但是理论上C3P0的速度应该更快,但是我测试的数据却恰恰相反,很是奇怪。

总结:

1>DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口
2>DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包
3>C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时
会自动在指定的目录下找xml文件,并加载默认设置

4>tomcat用的也是c3p0

6.导入的jar包

commons-dbcp.jar:DBCP实现要导入的jar

commons-pool.jar: 连接池实现的依赖类

commons-collections.jar :连接池实现的集合类

c3p0-0.9.1.2.jar :C3P0实现要导入的jar包

MySql数据库连接池的更多相关文章

  1. 一个简单的MySql数据库连接池的实现

    package cn.hc.connectionPool; import java.io.IOException; import java.io.InputStream; import java.sq ...

  2. Python实现Mysql数据库连接池

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

  3. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息

    1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...

  4. MySql数据库连接池专题

    MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html

  5. python3 实现mysql数据库连接池

    首先声明一下,这篇博客进行了通过自己的代码方式,加上这篇博客,最后总结出这段代码.参考博客连接:http://blog.csdn.net/zbc1090549839/article/details/5 ...

  6. mysql数据库连接池使用(二)实现自己的数据库连接池

    上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...

  7. mysql数据库连接池使用(一)dbcp方式的配置

    Apache的数据库连接池 DBCP的常用配置说明,因为项目中用到了需要对其封装,所以必须先了解怎么配置以及各个配置字段的含义,理解的基础上开发我们自己的数据库连接池.可以参考官网dbcp官网. db ...

  8. node+mysql 数据库连接池

    1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...

  9. Tomcat中配置MySQL数据库连接池

    Web开发中与数据库的连接是必不可少的,而数据库连接池技术很好的优化了动态页与数据库的连接,相比单个连接数据库连接池节省了很大的资源.用一个通俗的比喻:如果一个人洗澡需花一桶水,那一百个人就要花一百桶 ...

随机推荐

  1. codeforces 702E Analysis of Pathes in Functional Graph 倍增

    题目链接 给一个图, 然后给出每条边的权值和一个k值. 让你求出从每个点出发, 走k次能获得的边权的和以及边权的最小值. 用倍增的思想, 求出每个点走一次能到达的点, 权值和以及最小值, 走两次..四 ...

  2. codevs 1913 数字梯形问题 费用流

    题目链接 给你一个数字梯形, 最上面一层m个数字, 然后m+1,......m+n-1个. n是层数. 在每个位置, 可以向左下或右下走.然后让你从最顶端的m个数字开始, 走出m条路径, 使得路过的数 ...

  3. nginx,wsgi,flask之间的关系

    之前看写flask 应用的一些疑问,百度上的答案解释的不错,这里记着以后可以看看Web 服务器层对于传统的客户端 - 服务器架构,客户端向服务器发送请求,服务器接收请求,处理请求,最后给客户端返回请求 ...

  4. 树莓派设置成无线路由(AP)

    1.安装需要的包 sudo apt-get install hostpad uhdcpd 2.配置/etc/network/interfaces文件 配置wlan0为静态地址 格式如下: iface ...

  5. SQL Server 从数据库快照还原数据库

    语法: restore database db_name from database_snapshot  = 'db_snapshot_name'; ------------------------- ...

  6. discuz方法赏析

    public static function limit($start, $limit = 0) { $limit = intval($limit > 0 ? $limit : 0); $sta ...

  7. AndroidUI 布局动画-布局内容改变动画

    实现一个点击菜单动画添加按钮,点击按钮移除当前按钮的动画效果: <LinearLayout xmlns:android="http://schemas.android.com/apk/ ...

  8. Java 类加载与初始化

    Java系列笔记(1) - Java 类加载与初始化 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理 ...

  9. SharePoint 2013 WebPart属性面板配置

    为WebPart添加右侧的属性面板,方便将来对于WebPart的配置,我们只需要在CustomWebPart.cs文件里面,声明一下变量即可: private string url = string. ...

  10. Struts2核心包

    Commons-logging.jar  --------------   用于通用日志处理 Freemarker.jar  --------------   表现层框架,定义了struts2的可视组 ...