首先要知道数据库连接(Connection对象)的创建和关闭是非常浪费系统资源的,如果是使用常规的数据库连接方式来操作数据库,当用户变多时,每次访问数据库都要创建大量的Connnection对象,使用完成后关闭连接。这一过程频繁地使用时,会导致程序性能急剧下降。如果项目存在频繁访问数据库的操作,则应该使用数据库连接池来管理数据库连接,可以显著提升程序运行效率。

数据库连接池原理

先回顾一下Java程序访问数据库的步骤:
①加载载数据库驱动程序-->②通过jdbc建立数据库连接-->③访问数据库,执行sql语句-->④关闭数据库连接。
        如果是一个网站,每次用户进行查询或者登录等访问数据库的操作,则数据库连接就会不停地创建,然后又关闭,系统资源被毫无节制的分配,如果连接过多,甚至会导致服务器的崩溃。所以在每次使用完数据库连接后,不对其进行关闭,而是存储起来,等待下一次的使用,这样就能避免重复创建数据库连接和关闭连接所带来的时间消耗,从而做到对数据库连接的有效管理,这就是数据库连接池的原理。关于连接池,Java中的许多连接池也是类似原理,例如线程池、对象池等,其优势就是减少资源频繁分配所带来的延迟,从而提高性能。
 

数据库连接池的介绍

在Java中有一个DataSource接口类,所有的连接池都是对该接口的实现。数据源在网上有许多种,但大体差不多,所以下面就简单介绍一下DBCP数据源和C3P0数据源的使用方式,但也可以自己去实现该接口,完成一个功能简单的连接池。除了上面说的两个数据源,另外推荐使用阿里的Druid数据源,功能比较强大。
DBCP数据源和C3P0数据源以及配置文件都已经打包好了,需要的自行下载:数据库连接池jar包下载
 

DBCP数据源

相关配置参数
常用的例如驱动程序、数据库地址(url)和账户密码的作用就不说了,DBCP的主要参数如下:
 
initialSize
 
初始化连接:连接池启动时创建的连接数量;
maxActive
 
最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 设为负数表示不限制;
maxIdle
 
最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,设为负数表示不限制;
minIdle
 
最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,设为0则不创建;
maxWait
 
最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,设为-1表示无限等待。
 
使用DBCP需要导入两个包commons-dbcp-1.4.jar和commons-pool-1.6.jar,这两个包可在官网Apache commons下载,至于版本根据个人来选择。配置DBCP数据源可以采用多种方式配置,非Web项目的话就用*.properties文件或者代码配置,在Web项目中当然最好使用JNDL(Java命名和目录接口服务)。
这里采用属性文件的方式来配置DBCP数据源,配置列表如下:

#数据库驱动包程序
driverClassName=com.mysql.jdbc.Driver
#访问的数据库地址 ,高版本Mysql要求使用SSL,这里改成false,就没警告了。
url=jdbc:mysql://localhost:3306/testdb?useSSL=false
#数据库用户
username=root
#数据库密码
password=1234
#初始连接数
initialSize=5
#最大活动连接数
maxActive=10
#最小空闲数
minIdle=3
#超过时长 6s
maxWait=60000
public class DBCPUtils{
private static DataSource ds = null;//数据源只需要一个,设为static。
//静态块只加载一次
static {
try {
InputStream is = new FileInputStream("dbconfig.properties");//加载配置文件
Properties prop = new Properties();
prop.load(is);
//使用DBCP的数据源工厂来创建数据源
ds = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 使用DBCP数据源来获取数据库连接
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = ds.getConnection();//从连接池中拿出一个连接
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭资源
*/
public void close(Connection conn, Statement st, ResultSet rs) {
//关闭结果集对象
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭执行SQL语句的Statement对象
if(st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//关闭连接,并非真正关闭,而是返回连接池
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
代码里面配置DBCP数据源(不推荐,仅作了解)
	private static BasicDataSource ds = null;
static {
//创建数据源对象
ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false");
ds.setUsername("root");
ds.setPassword("1234");
ds.setInitialSize(5);
ds.setMaxActive(25);
ds.setMinIdle(10);
}

C3P0数据源

和DBCP数据源一样,需要导入两个包:c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.11.jar。

相关配置参数

initialPoolSize:连接池初始化时创建的连接数,default : 3,取值应在minPoolSize与maxPoolSize之间。
minPoolSize:连接池保持的最小连接数,default :3
maxPoolSize:连接池中拥有的最大连接数,如果获得新连接时连接总数超过该值则不再获取新连接,而是等待其他连接释放,default :15。
acquireIncrement:连接池在无空闲连接可用时一次性创建的新数据库连接数,default :3
maxIdleTime:连接的最大空闲时间,如果超过这个时间,某个连接还未被使用,则会断开这个连接。如果为0,则永远不会断开连接,default : 0 。
idleConnectionTestPeriod:每900秒检查所有连接池中的空闲连接
acquireRetryAttempts:连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。

配置方式推荐两种:一是类似上面配置DBCP数据源所采用的属性文件方式,但C3P0的配置属性文件名必须为c3p0.properties,而且属性名为c3p0.属性名,不然没法解析。最重要的存放路径一定要对,不然会找不到,从而一直出现异常;二是采用XML配置文件,在类路径下新建一个c3p0-config.xml文件。

如图所示,要放在存放类文件的路径之下,不然找不到。

使用properties方式

#mysql驱动程序
c3p0.driverClass=com.mysql.jdbc.Driver
#数据库地址。高版本Mysql要求使用SSL,这里改成false,就没警告了。
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/testdb?useSSL=false
#用户
c3p0.user=root
#密码
c3p0.password=1234
#初始连接数
c3p0.InitialPoolSize = 5
#最大连接数
c3p0.maxPoolSize=20
#最小连接数
c3p0.minPoolSize=5
#连接的最大空闲时间,单位s
c3p0.maxIdleTime=10
#获得新连接失败时重试的次数
c3p0.acquireRetryAttempts=30
#连接池获得新连接时的间隔时间
c3p0.acquireRetryDelay=1000

使用XML配置方式

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,创建c3p0连接池对象时,没有指定名字,则使用该配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb?useSSL=false</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 省略设置参数,采用默认设定-->
</default-config> <!-- 命名配置,创建c3p0连接池对象时,指定该名字,则使用该配置 -->
<named-config name="MYSQL">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb?useSSL=false</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 设置配置参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">25</property>
<property name="minPoolSize">5</property>
<property name="maxIdleTime">60</property> <!-- 连接的最大空闲时间,单位s -->
<property name="acquireRetryAttempts">30</property> <!-- 获取连接失败时,重试次数 -->
<property name="acquireRetryDelay">30</property> <!-- 连接池获得新连接时的间隔时间 -->
</named-config>
</c3p0-config>

c3p0获取数据库连接的代码

public class C3p0Util {
private static ComboPooledDataSource ds =null;
static {
//指定名字,就使用该命名的配置;未指定则使用默认配置。
ds = new ComboPooledDataSource("MYSQL");
}
/**
* 从连接池获取数据库连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//省略关闭资源方法,和上面DBCP数据源的一样
}
 
以上就是最常用的两大开源数据库连接池的使用方法和配置方式,但这两个数据库连接池都没有连接监控,算是一个缺点,但数据库连接池proxool支持连接池监控,感兴趣可以自行了解。

JBDC—③数据库连接池的介绍、使用和配置的更多相关文章

  1. 数据库连接池php-cp介绍

    php-cp(php-connect-pool)是用php扩展写的一个数据库连接池. 我们知道php开发速度快,适合创业快速迭代,但当流量大了之后,php大量的短连接给db层造成多余的消耗,而php处 ...

  2. 转!数据库连接池概念、种类、配置(DBCP\C3P0\JndI与Tomact配置连接池)

    数据库连接池概念.种类.配置(DBCP\C3P0\JndI与Tomact配置连接池) 一.DBCP 连接:DBCP 连接池是 Apache 软件基金组织下的一个开源连接池实现. 需要的 java 包c ...

  3. java配置数据库连接池的方法步骤

    java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下   先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...

  4. Spring Boot 数据库连接池 Druid

    简介 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问 ...

  5. java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、

    一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...

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

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

  7. JavaWeb学习总结(十三)--数据库连接池

    一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ...

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

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

  9. c3p0数据库连接池的使用

    一.c3p0与dbcp区别 dbcp没有自动回收空闲连接的功能 c3p0有自动回收空闲连接功能 <C3P0是Hibernate3.0默认的自带数据库连接池,DBCP是Apache开发的数据库连接 ...

随机推荐

  1. javascript中简单提示框

    CSS部分 .help-tip{ width: 340px; border:1px solid #A0A0A0; background-color: #F8F8F8; border-radius: 5 ...

  2. CentOS7.x使用yum安装Mysql5.6

    先检查是否存在已安装的MySQL # yum list installed | grep mysql 若存在删除: yum remove 软件名称 CentOS 7的yum源中没有正常安装mysql时 ...

  3. Docker相关连接

    docker-compose文档:https://docs.docker.com/compose/compose-file/ dockerfile文档:https://docs.docker.com/ ...

  4. [翻译] TLTagsControl

    TLTagsControl https://github.com/ali312/TLTagsControl#tltagscontrol A nice and simple tags input con ...

  5. Windows事件--重复事件检测

    监视器--Windows事件--重复事件检测--计时器重置: 自动重置计时器:指定等待时间10分钟,则在10分钟后自动关闭该警报,更改状态为 正常(绿色) 检测事件1,事件3重置计数器状态,2分钟内检 ...

  6. Effective C++(20) 继承与面向对象设计

    本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...

  7. CopyrightHelper—开源VS插件辅助插入版权注释

    前言 有很多时候,我们在写代码的时候需要在代码文件头加上描述和版权信息等,如果使用代码项目模板又得为每种文件定模板,而已不方便,如果从某个地方复制过来,又嫌麻烦... 为了能解决这种懒人的需求,我开始 ...

  8. August 27th 2017 Week 35th Sunday

    You can't be brave if you've only had wonderful things happen to you. 人生若只是有美好的境遇,那你也没办法学会勇敢. Wherea ...

  9. January 11 2017 Week 2nd Wednesday

    One always has time enough, if one will apply it well. 如果你能好好地利用,你总有足够的时间. If you always feel that y ...

  10. OC文件操作2

    1.对文件本身的操作 NSManager 2.对文件内容的操作 NSHandle 文件句柄 NSFileHandle * fh = [NSFileHandle fileHandleForReading ...