实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池
1.1 连接池概述
概念
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
规范
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!连接池和数据源是同一个意思
常见的连接池:DBCP、C3P0。
接下来,我们就详细的学习连接池。
1.2 C3P0连接池
C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件 c3p0-config.xml
1.2.1 导入jar包
我们使用的0.9.2版本,需要导入2个jar包
下载地址:https://download.csdn.net/download/qq_26106607/10443785
1.2.2 核心类
@Test
public void demo01() throws Exception{
//1 获得连接池(数据源)
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//1.1 设置基本项
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/webdb_4");
dataSource.setUser("root");
dataSource.setPassword("root");
//1.2其他项
// * 初始化连接池中连接的个数
dataSource.setInitialPoolSize(5);
// * 最小|最大 连接池中连接的个数
dataSource.setMinPoolSize(2);
dataSource.setMaxPoolSize(10);
// * 最大空闲数
dataSource.setMaxIdleTime(60);
// * 每次增长个数
dataSource.setAcquireIncrement(2);
//2获得连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
1.2.3 配置文件
配置文件名称:c3p0-config.xml (固定)
配置文件位置:src (类路径)
配置文件内容:命名配置
c3p0-config.xml具体的配置
<c3p0-config>
<!-- 命名的配置 -->
<named-config name="wulin">
<!-- 连接数据库的4项基本参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/webdb_4</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化连接数 -->
<property name="initialPoolSize">20</property>
<!-- 最小连接受 -->
<property name="minPoolSize">10</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">40</property>
<!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
<property name="maxStatements">0</property>
<!-- 连接池内单个连接所拥有的最大缓存statements数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
<!-- 默认配置 -->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/webdb_4</property>
<property name="user">root</property>
<property name="password">root</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>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
</c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<!--
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
<property name="user">root</property>
<property name="password">1234</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>
<user-overrides user="test-user">
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<property name="maxStatements">0</property>
</user-overrides>
</default-config>
-->
c3p0-config.xml命名的配置测试代码:
@Test
public void demo01() throws Exception{
//1 获得连接池(数据源)
// * c3p0 jar包将自动加载“c3p0-config.xml”文件,并获得具体的配置信息
// ** 在配置文件中 <named-config name="名称"> ,可以通过核心类 new ComboPooledDataSource("名称")
ComboPooledDataSource dataSource = new ComboPooledDataSource("wulin");
//2获得连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
c3p0-config.xml默认的配置测试代码:
@Test
public void demo01() throws Exception{
//1 获得连接池(数据源)
// * c3p0 jar包将自动加载“c3p0-config.xml”文件,并获得具体的配置信息
// ** 在配置文件中 <default-config> ,可以通过核心类 new ComboPooledDataSource()
ComboPooledDataSource dataSource = new ComboPooledDataSource();//默认的配置没有名字,所以不用写
//2获得连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
1.2.4 常见配置项
分类 | 属性 | 描述 |
必须项 | user | 用户名 |
password | 密码 | |
driverClass | 驱动 mysql驱动,com.mysql.jdbc.Driver | |
jdbcUrl | 路径 mysql路径,jdbc:mysql://localhost:3306/数据库 | |
基本配置 | acquireIncrement | 连接池无空闲连接可用时,一次性创建的新连接数 默认值:3 |
initialPoolSize | 连接池初始化时创建的连接数 默认值:3 | |
maxPoolSize | 连接池中拥有的最大连接数 默认值:15 | |
minPoolSize | 连接池保持的最小连接数。 | |
maxIdleTime | 连接的最大空闲时间。如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,如果为0,则永远不会断开连接。 默认值:0 | |
管理连接池的大小和连接的生存时间(扩展) | maxConnectionAge | 配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。默认值0 |
maxIdleTimeExcessConnections | 这个配置主要是为了减轻连接池的负载,配置不为0,则会将连接池中的连接数量保持到minPoolSize,为0则不处理。 | |
配置Prepared Statement缓存(扩展) | maxStatements | 连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存,同时maxStatementsPerConnection的配置无效。 |
maxStatementsPerConnection | 连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。 |
1.2.5 编写工具类
C3P0提供核心工具类:ComboPooledDataSource,如果要使用连接池,必须创建该类的实例对象。
new ComboPooledDataSource(“名称”); 使用配置文件“命名配置”
<named-config name="wulin">
new ComboPooledDataSource(); 使用配置文件“默认配置”
<default-config>
public class C3P0Utils{
//使用默认配置
// private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//使用命名配置
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("wulin");
/**
* 获得数据源(连接池)
* @return
*/
public static DataSource getDataSource(){
return dataSource;
}
/**
* 获得连接
* @return
* @throws SQLException
*/
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
1.3 DBCP连接池
DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。
1.3.1 导入jar包
下载地址:
https://download.csdn.net/download/qq_26106607/10443791
1.3.2 核心类
@Test
public void demo01() throws Exception{
//1 获得连接池
BasicDataSource dataSource = new BasicDataSource();
//1.1 基本项
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/webdb_4");
dataSource.setUsername("root");
dataSource.setPassword("root");
//1.2 其他项
// * 初始化连接池中连个的个数
dataSource.setInitialSize(5);
// * 最大活动数
dataSource.setMaxActive(10);
//2获得连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
1.3.3 配置文件
配置文件名称:*.properties
配置文件位置:任意,建议src(classpath/类路径)
配置文件内容:properties不能编写中文,不支持在STS中修改,必须使用记事本修改内容,否则中文注释就乱码了
dbcp-config.properties具体配置:
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/webdb
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
测试代码:
@Test
public void demo01() throws Exception{
//1 获得连接池
//1.1 加载properties文件,获得Properties对象
InputStream is = DBCPDemo_02.class.getClassLoader().getResourceAsStream("dbcp-config.properties");
Properties props = new Properties();
props.load(is);
//1.2获得连接池
DataSource dataSource = BasicDataSourceFactory.createDataSource(props);
//2获得连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
1.3.4 常见配置项
分类 | 属性 | 描述 |
必须项 | driverClassName |
|
url |
| |
username |
| |
password |
| |
基本项 | maxActive | 最大连接数量 |
minIdle | 最小空闲连接 | |
maxIdle | 最大空闲连接 | |
initialSize | 初始化连接 | |
|
|
|
优化配置(扩展) | logAbandoned | 连接被泄露时是否打印 |
removeAbandoned | 是否自动回收超时连接 | |
removeAbandonedTimeout | 超时时间(以秒数为单位) | |
maxWait | 超时等待时间以毫秒为单位 1000等于60秒 | |
timeBetweenEvictionRunsMillis | 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位 | |
numTestsPerEvictionRun | 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 | |
minEvictableIdleTimeMillis | 连接在池中保持空闲而不被空闲连接回收器线程 |
参考文档:http://commons.apache.org/proper/commons-dbcp/configuration.html
1.3.5 编写工具类
public class DBCPUtils{
private static DataSource dataSource;
static{
try {
//1 加载配置文件,获得文件流
InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");
//2 使用Properties处理配置文件
Properties props = new Properties();
props.load(is);
//3 使用工具类创建连接池(数据源)
dataSource = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static DataSource getDataSource(){
return dataSource;
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}