数据库连接池
Posted shengwangmei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。
一、什么是数据库连接池
数据库连接是一种关键的、有限的、昂贵的资源。每次用户获取数据库连接都需要消耗较大的资源,数据库连接池可以管理连接,可以重复使用连接而不需要每次都进行创建。使用池来管理连接的生命周期,可以节省资源,提高性能。用池来管理Connection,这可以重复使用Connection。有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。数据库连接池的原理通俗地说:先创建好几个数据库放在池里,等系统需要用了直接去连接,并做上标记(连接),用完后再将数据库连接还回到池里,同时做上标记(空闲)。当有连接需求时,此时又没有空闲数据库连接,则会新建立连接放入池中。而这些参数我们都可以自己进行配置,如:
- 初始大小:10个
- 最小空闲连接数:3个
- 增量:一次创建的最小单位(5个)
- 最大空闲连接数:12个
- 最大连接数:20个
- 最大的等待时间:1000毫秒
二、常见连接池
这里总结下两个常见的连接池:DBCP和c3p0。导包是使用数据库连接池的第一步,
1.DBCP:导jar包,commons-pool.jar、commons-dbcp.jar
DBCP是Apache提供的一款开源免费的数据库连接池。
public void demo1() throws SQLException {
//导入核心类:BasicDataSource
BasicDataSource ds = new BasicDataSource();
//基本配置
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setUsername("root");
ds.setPassword("123");
//最大连接数
ds.setMaxActive(20);
//最大空闲连接数:表示即使没有数据库连接时依然可以保持10个空闲的连接,而不被清除,随时处于待命状态。设 0 为没有限制。
ds.setMaxIdle(10);
//初始化连接数
ds.setInitialSize(10) ;
//最小空闲连接数
ds.setMinIdle(2) ;
//最大等待毫秒数
ds.setMaxWait(1000) ;
Connection con = ds.getConnection();
//只是将连接归还池
con.close() ;
}
2.c3p0:导jar包,c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar
c3p0也是开源免费的连接池!
public void demo2() throws PropertyVetoException, SQLException {
//导入核心类:ComboPooledDataSource
ComboPooledDataSource ds = new ComboPooledDataSource();
//基本配置
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setUser("root");
ds.setPassword("123");
//每次的增量为5
ds.setAcquireIncrement(5) ;
//初始化连接数为20
ds.setInitialPoolSize(20) ;
//最少连接数为2
ds.setMinPoolSize(2) ;
//最大连接数为50
ds.setMaxPoolSize(50) ;
Connection con = ds.getConnection();
//只是将连接归还池
con.close();
}
使用配置文件进行连接,有两个要求:(1)配置文件:c3p0-config.xml;(2)文件位置:src下
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
c3p0的配置文件中可以配置多个连接信息,可以给每个配置起个名字,这样可以方便的通过配置名称来切换配置信息。上面文件中默认配置为mysql的配置,名为test-config的配置也是mysql的配置。此时可以使用有参构造器进行指定配置信息:ComboPooledDataSource ds = new ComboPooledDataSource("test-config") 。
<named-config name="test-config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">123</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</named-config>
文末:不知道大家有没有对c3p0这个连接池名字好奇,网上查了下c3p0的全称,发现了一个小故事:
据传闻:c3p0连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。C3P0就是下图中的右边的那个机器人。左边是他哥哥R2D2。(小故事来源:https://blog.csdn.net/wang_xuaohao/article/details/8565864)
以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段
连接池报错 Proxool Provider unable to load JAXP configurator file: proxool.xml
MySQL与Redis数据库连接池介绍(图示+源码+代码演示)