JDBC连接池
1 连接池介绍
1.1 概述
为解决传统开发中的数据库连接耗费资源和时间很多的问题,可以采用数据库连接池技术,提高性能。
1.2 连接池的工作原理
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
1.3 数据库连接池技术的优点
资源重用:
由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
更快的系统反应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
统一的连接管理,避免数据库连接泄露
在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露
1.4 连接池的实现
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。
2 常用的数据源配置
2.1 C3P0连接池
C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。
使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件
c3p0-config.xml
使用步骤:
1、添加jar包
c3p0-0.9.1.2.jar
mchange-commons-java-0.2.11.jar
2、编写配置文件
c3p0-config.xml,放在src中(注:文件名一定不要写错)
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=utf8
</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">neapadmin</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
</c3p0-config>
核心代码:
private static DataSource ds=new ComboPooledDataSource();
使用配置文件,创建c3p0连接 Datasurce对象。
通过dataSource.getConnection(),可以获取连接对象。
注: DataSource对象,整个项目只要一个就可以了,不要创建多个。
注意:jdbcurl在写的时候指定编码格式,但是在xml文件下,需要使用转义符;
参照:https://blog.csdn.net/xdqkid/article/details/53708657
- 写完之后,检测是否连接到了数据库
package util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
static private DataSource ds=new ComboPooledDataSource();
public static DataSource getDataSource() {
return ds;
}
static public Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
package util;
import java.sql.Connection;
import java.sql.SQLException;
public class Testapp {
public static void main(String[] args) throws SQLException {
Connection conn=C3P0Utils.getConnection();
if(conn==null) {
System.out.println("数据库连接失败");
}else {
System.out.println("success");
}
}
}