连接池的作用
连接池的作用就是为了提高性能。
连接池的作用:连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。
基本原理是这样的:
(1)建立数据库连接池对象(服务器启动)。
(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
(4)存取数据库。
(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
1 .连接池的概念和为什么要使用连接池?
连接池放了N个Connection对象,本质上放在内存当中,在内存中划出一块缓存对象,应用程序每次从池里获得Connection对象,而不是直接从数据里获得,这样不占用服务器的内存资源。
2 .如果不使用连接池会出现的情况:
a.占用服务器的内存资源
b.导致服务器的速度非常慢
3 .应用连接池的三种方式:
a.自定义连接池
b.使用第三方连接池
c.使用服务器自带的连接池
连接池一般比直接连接更有优越性,因为它提高了性能的同时还保存了宝贵的资源。在整个应用程序的使用过程,当中重复的打开直接连接将导致性能的下降。而池连接只在服务器启动时打开一次,从而消除了这种性能问题。
连接池主要考虑的是性能,每次获取连接和释放连接都有很大的工作量,会对性能有很大影响;而对资源来说起的是反作用,因为保存一定数量的连接是要消耗内存的。应用程序每次从池里获得Connection对象,而不是直接从数据里获得,这样不占用服务器的内存资源。所以一般要建立连接池,而连接的数量要适当,不能太大,太大会过多消耗资源。(所以,考虑2个方面,一个是内存,另一个是资源)。
连接池就是为了避免重复多次的打开数据库连接而造成的性能的下降和系统资源的浪费。
连接池实现类
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBCPUtil {
//定义数据源
private static DataSource ds = null;
/*
初始化对象 BasicDataSource
通过BasicDataSource类实现获取Connection链接,并且支持设置相关属性:
最大链接数、最小连接数、初始化链接数、最大等待时...*/
private static BasicDataSource bds = new BasicDataSource();
//获取外部资源文件
private static ResourceBundle rb=ResourceBundle.getBundle("dbcp");
/*
验证qu动
*/
static{
try {
Class.forName(rb.getString(driverClassName));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获得链接
*/
public Connection getConn(){
if(rb==null){
System.out.println("加载资源文件失败");
}else if(ds==null){
//获取参数
String url= rb.getString("url");
String userName= rb.getString("userName");
String driverClassName= rb.getString("driverClassName");
String maxActive= rb.getString("maxActive");
String minIdle= rb.getString("minIdle");
String maxWait= rb.getString("maxWait");
String userPwd= rb.getString("userPwd");
//存入初始化对象中
bds.setUsername(userName);
bds.setPassword(userPwd);
bds.setUrl(url);
bds.setDriverClassName(driverClassName);
bds.setMaxActive(Integer.parseInt(maxActive));
bds.setMinIdle(Integer.parseInt(minIdle));
bds.setMaxWait(Integer.parseInt(maxWait));
//将初始化对象 赋值给数据源
ds = bds;
}
Connection conn = null;
// 返回链接
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 190; i++) {
DBCPUtil dp = new DBCPUtil();
Connection conn = dp.getConn();
System.out.println(i+"==="+conn);
//关闭
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
dbcp用到的jar包
dbcp.properties
url=jdbc\:mysql\://127.0.0.1\:3306/tyydb?userUnicode\=true&characterEncoding\=utf-8&serverTimezone\=GMT%2B8
userName=root
driverClassName=com.mysql.jdbc.Driver
maxActive=50
minIdle=10
maxWait=1000
userPwd=root
initialSize=30
DBCP连接池配置参数
initialSize 初始化连接数,即连接池启动时池子中的连接数目
maxActive 最大活动连接数,即连接池中可同时连接的最大数目
minIdle 最小空闲连接,连接池中最少的空闲的连接数,低于这个数量时,意味着连接不够用了,会被创建新的连接默认为0,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;
不宜太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置。
maxIdle 最大空闲连接,超过此参数时空闲连接将被释放,如果设置为负数表示不限制,默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置
maxWait 请求连接时,最长的等待时间。单位ms,当没有可用连接时,连接池会等待连接释放,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限)。