1. 在实际开发过程中,特别是在web应用系统中,如果程序直接访问数据库中的数据,每一次数据访问请求丢必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接。而连接并打开数据库是一件既消费资源又费时的工作,如果频繁发生这种操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术就是解决这个问题的常用方法。
  2. 基本思想:
    • 为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定量的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用

      *完毕之后再放回去。
  3. 数据库连接池负责:
    • 分配、管理、释放连接,它允许应用程序重复使用一个现有的链接,而不是重新建立一个。
    • 4.最大最小连接数
    • 数据库连接池在初始化时将创建一定数量的数据库链接放到连接池中,这些数据库连接数量由最小数据库连接数来设定无论这些;连接

      *是否被使用,连接池都将保证至少拥有这么多的连接数,连接池的最大数据库连接数限定了这个连接池能占有的最大连接数,当应用程序

      *向连接池请求的连接超过最大连接数时这些请求就被加入到等待队列中。
  4. 优点:
    • ——资源重用
    • ——更快的系统反应速度
    • ——新的资源分配手段
    • ——统一的资源管理,避免数据库连接的泄露
  5. 两种开源的数据库连接池
    • JDBC数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由服务器

      *(Weblogic、WebSphere、Tomcat)提供实现,也有一些开源组织提供实现
    • ——DBCP数据库连接池
    • ——C3P0数据库连接池

DataSource通常被称为数据源,它包含连接池和连接池管理管理部分,通常习惯上把DataSource称为连接池

实例:

jar包:commons-dbcp2-2.1.1.jar、c3p0-0.9.5.2.jar

配置文件

    /**
* 10.使用数据库连接池创建连接
*一个连接池只需要创建一次就行,所以连接池的代码需要使用static
*/
private static DataSource dataSource= null;
static {
dataSource = new ComboPooledDataSource("helloC3P0");
} public static Connection getConnectionWithC3P0(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

文件名:c3p0-config.xml
<c3p0-config>
<!-- This app is massive! -->
<!-- 指定数据源的基本属性 -->
<named-config name="helloC3P0">
<property name="user">root</property>
<property name="password"></property>
<property name="jdbcUrl">jdbc:mysql:///test</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 初始化数据库连接池数量 -->
<property name="initialPoolSize">5</property>
<!-- 若连接池中连接不足时,一次向数据库服务器申请多少个连接数 -->
<property name="acquireIncrement">5</property>
<!-- 数据库连接池中最小连接数 -->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中最大连接数 -->
<property name="maxPoolSize">100</property>
<!-- C3P0数据库连接池中可以维护的Statement的个数-->
<property name="maxStatements">10</property>
<!-- 每个连接同时可以使用Statement对象的个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
public class ConnectionPool {

    /**
* 1.使用DBCP连接池
* @throws SQLException
* dbcp包依赖pool包
*/
@Test
public void testDBCP() throws SQLException{
// dataSource = null;
//1.创建DataSource数据源实例
final BasicDataSource dataSource = new BasicDataSource();
System.out.println(dataSource);//org.apache.commons.dbcp2.BasicDataSource@740545a6
//2.为数据源实例指定必须的属性
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setUrl("jdbc:mysql:///test");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//3.为数据源实例指定非必须的属性
//——①指定数据库连接池中初始化连接数
dataSource.setInitialSize(5);
//——②指定最大连接数:同一时刻可以向数据库请求的连接数
dataSource.setMaxTotal(5);
//——③指定最小连接数:在数据库连接池中保存的最少的空闲连接数量
dataSource.setMinIdle(2);
//——④等待连接池陪分配连接的最长的等待时间,单位毫秒,超出该时间报异常
dataSource.setMaxWaitMillis(1000 * 5);
//4.从数据源中获取连接
Connection conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println(conn.getClass()); Connection connection = dataSource.getConnection();
System.out.println("》"+conn.getClass()); //使用多线程,主线程5个连接请求,另一个线程再请求一个连接
new Thread(){
public void run(){
Connection conn = null;
try {
conn = dataSource.getConnection();
System.out.println(conn.getClass());
} catch (SQLException e) {
e.printStackTrace();
}
};
}.start(); //主线程请求的连接等3秒之后释放一个,
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭一个连接释放资源,
connection.close(); }
/**
* 2.修改以上方法,使用配置文件创建连接池
* 步骤:
* ①加载dbcp的配置文件
* ②调用BasicDataSourceFactory的createDataSource方法创建DataSource实例
* ③DataSource中获取数据库连接
* @throws IOException
*/
@Test
public void testDBCPWithDataSourceFactory() throws Exception{ Properties properties = new Properties();
InputStream inStream = ConnectionPool.class.getClassLoader().
getResourceAsStream("dbcp.properties");
properties.load(inStream);
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
System.out.println(dataSource);//org.apache.commons.dbcp2.BasicDataSource@2abbf6ed
//获取最大等待时间
BasicDataSource basicDataSource = (BasicDataSource)dataSource;
System.out.println("等待时间:"+basicDataSource.getMaxWaitMillis());
//获取连接
Connection conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println(conn.getClass()); conn = dataSource.getConnection();
System.out.println("》"+conn.getClass());
//因为最大连接数是5,所以该请求会放入到等待队列中,等待时间为5秒,之后由于所有连接均未释放,所以报错
conn = dataSource.getConnection();
System.out.println(conn.getClass());
} /**
* 3.使用C3P0连接池
* @throws PropertyVetoException
* @throws SQLException
*
*/
@Test
public void testC3P0() throws Exception{ ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver
cpds.setJdbcUrl( "jdbc:mysql:///test" );
cpds.setUser("root");
cpds.setPassword("");
System.out.println(cpds.getConnection());
} /**
* 4.修改,以上方法,使用配置文件的形式,创建连接池
* @throws SQLException
* 步骤:
* 1.创建c3p0-config.xml配置文件
* 2.创建CombPooledDataSource实例
* DataSource dataSource = new ComboPooledDataSource("helloC3P0");
* 3.从dataSource中获取连接
*/
@Test
public void testC3P0WithConfigFile() throws SQLException{ DataSource dataSource = new ComboPooledDataSource("helloC3P0");
System.out.println(dataSource.getConnection()); }
/**
* 测试TestTools工具类中使用连接池创建连接
*/
@Test
public void testConnectionWithTestTools(){
Connection conn = TestTools.getConnectionWithC3P0();
System.out.println(conn);
//对连接池中的连接进行关闭操作,并不是真的把连接关闭了,而是把连接归还到连接池中去。
TestTools.release(null, conn);
} }

JDBC(11)—数据库连接池的更多相关文章

  1. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  2. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  3. JDBC【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...

  4. Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用

    DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...

  5. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  6. spring配置tomcat jdbc pool数据库连接池

    <bean id="sqliteDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" de ...

  7. JavaEE JDBC 了解数据库连接池

    了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...

  8. JDBC和数据库连接池

    JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成. ​ ● JDBC ​ ● C3P0 ​ ● DRUID 一.JDBC ...

  9. 关于jdbc和数据库连接池的关系(不是封装的关系)

    你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...

  10. Jdbc druid数据库连接池

    //测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...

随机推荐

  1. bzoj2969矩形粉刷

    题解: 和前面那个序列的几乎一样 容斥之后变成求不覆盖的 然后再像差分的矩形那样 由于是随便取的所以这里不用处理前缀和直接求也可以 代码: #include <bits/stdc++.h> ...

  2. James Munkres Topology: Sec 37 Exer 1

    Exercise 1. Let \(X\) be a space. Let \(\mathcal{D}\) be a collection of subsets of \(X\) that is ma ...

  3. Codeforces 1045B Space Isaac

    Space Isaac 我们定义第一个集合为a, 第二个集合为b 先把a数组排序, 然后我们会以线段的形式得到b集合. 我们先用a[ 1 ]去和 b 中的元素结合, 只有size(a) 个数字未被覆盖 ...

  4. 51Nod1553 周期串查询 字符串 哈希 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html 题目传送门 - 51Nod1553 题意 有一个串只包含数字字符.串的长度为n,下标 ...

  5. 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义

    一:任务 1.任务 常用的验证注解 自定义返回消息 自定义校验注解 二:Hibernate Validator 1.常见的校验注解 2.程序 测试类 /** * @throws Exception * ...

  6. java添加水印等比缩放

    /** * 图片天加文字水印(默认缩小scale) * 备注: * Positions.BOTTOM_RIGHT 表示水印位置 * * @param filePath 原图路径 * @param ne ...

  7. oracle获取某个月份的最后一天

    select last_day(to_date('1992-10','yyyy-mm')) from dual; 输出:1992/10/31

  8. 牛客练习赛28B (经典)【线段树】

    <题目链接> qn姐姐最好了~     qn姐姐给你了一个长度为n的序列还有m次操作让你玩,     1 l r 询问区间[l,r]内的元素和     2 l r 询问区间[l,r]内的元 ...

  9. Jenkins环境搭建(5)-与Jmeter完成参数化构建和构建前删除操作

    此前介绍过几篇关于Jenkins配置相关的文章,今天再来说说参数化构建和构建前删除已有的报告.在实际测试过程中,是需要测试几套环境的,不使用参数化构建的话,构建脚本就比较麻烦了:自然,已生成的报告,不 ...

  10. php手撸轻量级开发(三)composer小白入门

    composer介绍 composer是php的一个依赖管理工具,在项目中声明所依赖的外部工具库,会自动安装这些工具库及所依赖的库文件. 对我等初阶工程狮来说,就是拉别人的代码,用别人的库,一个进阶版 ...