JBDC—③数据库连接池的介绍、使用和配置
首先要知道数据库连接(Connection对象)的创建和关闭是非常浪费系统资源的,如果是使用常规的数据库连接方式来操作数据库,当用户变多时,每次访问数据库都要创建大量的Connnection对象,使用完成后关闭连接。这一过程频繁地使用时,会导致程序性能急剧下降。如果项目存在频繁访问数据库的操作,则应该使用数据库连接池来管理数据库连接,可以显著提升程序运行效率。
数据库连接池原理
数据库连接池的介绍
DBCP数据源
|
initialSize
|
|
初始化连接:连接池启动时创建的连接数量;
|
|
maxActive
|
|
最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 设为负数表示不限制;
|
|
maxIdle
|
|
最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,设为负数表示不限制;
|
|
minIdle
|
|
最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,设为0则不创建;
|
|
maxWait
|
最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,设为-1表示无限等待。
|
#数据库驱动包程序
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();
}
}
}
}
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数据源
相关配置参数
minPoolSize:连接池保持的最小连接数,default :3
maxPoolSize:连接池中拥有的最大连接数,如果获得新连接时连接总数超过该值则不再获取新连接,而是等待其他连接释放,default :15。
acquireIncrement:连接池在无空闲连接可用时一次性创建的新数据库连接数,default :3
maxIdleTime:连接的最大空闲时间,如果超过这个时间,某个连接还未被使用,则会断开这个连接。如果为0,则永远不会断开连接,default : 0 。
idleConnectionTestPeriod:每900秒检查所有连接池中的空闲连接
配置方式推荐两种:一是类似上面配置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数据源的一样
}
JBDC—③数据库连接池的介绍、使用和配置的更多相关文章
- 数据库连接池php-cp介绍
php-cp(php-connect-pool)是用php扩展写的一个数据库连接池. 我们知道php开发速度快,适合创业快速迭代,但当流量大了之后,php大量的短连接给db层造成多余的消耗,而php处 ...
- 转!数据库连接池概念、种类、配置(DBCP\C3P0\JndI与Tomact配置连接池)
数据库连接池概念.种类.配置(DBCP\C3P0\JndI与Tomact配置连接池) 一.DBCP 连接:DBCP 连接池是 Apache 软件基金组织下的一个开源连接池实现. 需要的 java 包c ...
- java配置数据库连接池的方法步骤
java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下 先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...
- Spring Boot 数据库连接池 Druid
简介 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问 ...
- java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、
一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...
- java web学习总结(十六) -------------------数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- JavaWeb学习总结(十三)--数据库连接池
一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ...
- javaweb学习总结(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- c3p0数据库连接池的使用
一.c3p0与dbcp区别 dbcp没有自动回收空闲连接的功能 c3p0有自动回收空闲连接功能 <C3P0是Hibernate3.0默认的自带数据库连接池,DBCP是Apache开发的数据库连接 ...
随机推荐
- svn add @2x image 文件
svn add `svn status . | grep "^?" | awk '{print $2"@"}'`
- AIX 6.1记录
安装Oracle需要开启远程桌面进行访问 1. X Windows需要如下软件包才能正常运行 lslpp -l X11.apps.rte X11.apps.xterm X11.base.rte X11 ...
- Android SDK开发与使用的那些事儿
前言 最近由于工作需要,将应用里的部分功能独立了出来,封装成 SDK 提供给合作伙伴使用.由于经验不足,网上也没多少写这方面内容的文章,遇到了不少的坑,决定记录下来. SDK 其实,刚说到要写SDK也 ...
- Tomcat启动时卡在“INFO: Deploying web application directory ......”的解决方法
https://blog.csdn.net/njchenyi/article/details/46641141
- NodeJS的特点
一. NodeJS的特点 我们先来看看NodeJS官网上的介绍: Node.js is a platform built on Chrome’s JavaScript runtime for easi ...
- String str = "1,2,3,4,5,6" 如何将这个字符串转换成int数组
String str = "1,2,3,4,5,6"; string[] strS = str.Split(','); int[] num = new int[strS.Lengt ...
- HTML IMG标签SRC为null
今天做项目遇到一个错 研究了半天才发现 其实就是一个小错 稍微注意一下 就能规避 HTML标签<img src="null">这种情况下在chrom的debug下就会报 ...
- 乘风破浪:LeetCode真题_014_Longest Common Prefix
乘风破浪:LeetCode真题_014_Longest Common Prefix 一.前言 如何输出最长的共同前缀呢,在给定的字符串中,我们可以通过笨办法去遍历,直到其中某一个字符不相等了,这样就得 ...
- swift 数组部分排序
数组自带排序函数,如果想实现部分排序,先对数组进行部分截取,然后对截取部分替换位排序好的子序列 var nums = [,,,,,,] var sub = nums[...] nums.replace ...
- 关于使用 CALayer 中 mask 的一些技巧
CALayer 拥有 mask 属性,Apple 的官方解释如下: An optional layer whose alpha channel is used to mask the layer’s ...