一、数据源连接池
1、为什么需要使用连接池
由于数据库的连接和关闭是一项非常耗时的任务,而用户在操作数据时会频繁的对数据库资源访问和关闭,为了提高数据库连接的性能,提高系统运行效率,提出用专门的容器管理数据库的连接和释放 ,数据库连接池就是为了解决这一问题而发明的。
2、什么是连接池
数据库连接池表示用于分配、管理、释放数据库连接的容器, 可以有效提高数据库连接的复用性和性能,可以将一个连接多次使用,而不释放给数据库。 可以通过设置各项参数(例如最大连接数,最大空闲时间,等待连接时长 )
类似这样的容器还有很多,例如 常量池,线程池
一般在项目开发中使用开源的数据库连接池 ,常用 c3p0 、dbcp、德鲁伊连接池 ,也可以自定义连接池 ,
基本原理: 容器初始化默认获取n个连接 , 应用程序需要建立连接直接从容器中获取,一旦容器的连接池分配完毕,但没有超出容器连接上限,此时可以继续从数据库建立连接, 应用程序使用完将连接对象释放给容器 , 以便再次使用 ,如果容器的连接超出默认连接数,会自动释放多余的连接。如果连接数超时容器设置的最大连接数,则不会获取新的连接,需要等待其他资源释放才可使用。
3、自定义连接池理解连接池原理
假设有一个存放连接对象的容器 ,可以使用集合存储连接对象(Connection) ,
4、使用开源的连接池
1、DBCP连接池(DataBase Connection Pool)
数据库开源连接池 提供一些基础配置,在管理连接池之前,需要配置数据源 DataSource
步骤1:导入开源jar包
commons-dbcp.jar 、
commons-pool.jar
步骤2: 写dbcp.properties配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/j2008_db?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username=root
password=123456
#最大连接数
maxActive=50
#最小连接数
minIdle=10
#最小空闲数
maxIdle=10
#初始化连接数
initialSize=5
#空闲线程超时回收时间
removeAbandonedTieout=10
#最大等待时间 毫秒
maxWait=1000
步骤三:
// 也通过读配置文件,将配置信息加载
try {
// 1、读取配置文件
InputStream is =DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties prop = new Properties();
// 2、加载属性文件
prop.load(is);
//3、 通过数据源工厂类
ds = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
步骤四: 测试并获取连接对象
/**
* 获取数据源连接对象
* @return
*/
public static Connection getConn(){
try {
if(ds!=null) {
return ds.getConnection();
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
2 Druid连接池
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。
替换前一个dbcp的jar包
druid-1.1.22.jar
其他配置于dbcp的非常相似
和其它连接池一样DRUID的DataSource类为:com.alibaba.druid.pool.DruidDataSource
常用配置如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="10" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="10000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<!-- 这里建议配置为TRUE,防止取到的连接不可用 -->
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
<!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
<!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
<property name="validationQuery" value="select 1 " />
<property name="filters" value="stat" />
<property name="proxyFilters">
<list>
<ref bean="logFilter" />
</list>
</property>
</bean>
在代码中创建数据源
druid.properties:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/j2008_db?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username=root
password=123456
其他基础配置同上
static DataSource ds ;
static{
try {
// 1、读取配置文件
InputStream is =DBCPUtil.class.getClassLoader().getResourceAsStream("druid.properties");
Properties prop = new Properties();
// 2、加载属性文件
prop.load(is);
//3、 通过数据源工厂类
ds = DruidDataSourceFactory.createDataSource(prop);
System.out.println(ds.getConnection());
} catch (Exception e) {
e.printStackTrace();
}
}