为什么必须使用数据库连接池:
1.普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接时都要将Connection加载到内存中,再验证用户名和密码。需要数据库连接的时候,就向数据库要求一个,执行完后就断开连接,这样的方式会消耗大量的资源和时间,数据库的连接资源并没有得到很好的重复利用。若是同时有几百人甚至几千人在线,频繁地进行数据库连接操作,这将会占用很多的系统资源,严重的甚至会造成服务器的奔溃。
2.使用DriverManager方式获取JDBC数据库连接,每一次数据库连接,操作完会后都要断开,否则,如果程序出现异常而未能关闭,将会导致数据库系统内存泄漏,最终将导致重启数据库。
3.同时,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌地分配出去,若果连接过多,也可能导致内存泄漏,服务器奔溃。
使用数据库连接池,可以避免以上几种问题。数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接漏洞;连接池的数据库连接数受最大连接数和最小连接数控制,因此不会出现连接过多内存泄漏的情况。
使用连接池和不使用连接池的区别:
1.获取连接的方式:
不使用:直接和数据库建立连接
使用:直接从连接池中获取连接
2.断开连接的方式:
不使用:直接和数据库断开连接
使用:将连接对象还给连接池
常用的连接池有Apache组织开发的DBCP和阿里巴巴开发的Druid,简单介绍一下如何使用者两种连接池:
1.DBCP:
1)准备jar包:
commons-dbcp-1.4.jar commons-pool-1.5.6.jar
2)实现连接池的相关的代码
public class DBCPUtil {
private static Properties p;
private static DataSource dataSource;
static {
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream in = loader.getResourceAsStream("db.properties");
Properties p = new Properties();
p.load(in);
//通过工厂类方式创建缓冲池
dataSource = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection conn,Statement state,ResultSet result){
try {
if(result != null){
result.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(state != null){
state.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
db.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hcd
username=root
password=admin
2.Druid:
1)将jar包导入到项目中:
druid-1.0.9.jar
2)实现连接池的相关的代码(基本跟DBCP的一样):
public class DruidUtil {
private static Properties p;
private static DataSource dataSource;
static{
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = loader.getResourceAsStream("db.properties");
p = new Properties();
p.load(inputStream);
//通过工厂类获取DataSource对象
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection conn,Statement state,ResultSet result){
try {
if(result != null){
result.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(state != null){
state.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}