什么是数据库连接池
当系统使用JDBC技术访问数据库时会创建一个connection对象,而该对象的创建过程是非常消耗资源的,并且创建对象的时间也比较长,假设系统一天有1万次的访问量,那么一天就会创建1万connection对象,这极大的浪费数据库的资源,而且可能造成数据库服务器内存溢出、宕机。 为了解决上面的问题,就引入了数据库连接池(Connection pooling),它主要用来分配、管理、释放数据库的连接。数据库连接池首先会创建若干(该数量可以配置)个connection对象并将这些对象放入到池中,当系统需要使用connection对象时,数据库连接池会从池中分配一个事先创建好的connection对象给系统,当系统使用完毕或超时后,数据库连接池会将该connection对象重新放入到池中。这样就减少了创建connection对象所耗费的资源和时间,可以提高对数据库操作的性能。
模拟编写一个数据库连接池
因为要用到数据库,所以需要将之前编写的JDBC相关的代码和jar包拷贝过来,创建一个SimpleConnectionPool类,里面需要实现下面三个功能:
- 初始化一个数据库连接池并向里面添加10个数据库连接
- 从连接池中获取连接
- 当程序用完连接后,需要将该连接重新放入到连接池中
需要注意数据库连接池要保证线程安全
package com.monkey1024.jdbc.pool;
import java.sql.Connection;
import java.util.Collections;
import java.util.LinkedList;
import com.monkey1024.jdbc.util.DBUtil;
/**
* 只是模拟编写数据库连接池,不能用于开发使用
*
*/
public class SimpleConnectionPool {
// 创建一个存放连接的池子,需要保证线程安全。
//因为LinkedList的添加和删除操作效率高,所以使用LinkedList作为连接池
private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections
.synchronizedList(new LinkedList<Connection>());
static {
try {
//向连接池中放10个连接
for (int i = 0; i < 10; i++) {
//创建一个数据库连接
Connection conn = DBUtil.getConnection();
pool.add(conn);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化数据库连接失败!");
}
}
// 从连接池中获取一个连接
public static Connection getConnectionFromPool() {
Connection conn = null;
if (pool.size() > 0) {
//将连接池中的一个连接取出
conn = pool.removeFirst();
return conn;
} else {
// 此时说明连接池中已经没有空闲连接了,需要等待
throw new RuntimeException("服务器忙。。。");
}
}
// 当程序用完连接后,需要将该连接重新放入到连接池中
public static void release(Connection conn) {
pool.addLast(conn);
}
}
下面是DBUtil工具类,这个类想必大家应该比较熟悉了,配置文件这里就不写了:
package com.monkey1024.jdbc.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class DBUtil {
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
ResourceBundle rb = ResourceBundle.getBundle("db");
driverClass = rb.getString("driverClass");
url = rb.getString("url");
username = rb.getString("username");
password = rb.getString("password");
try {
//注册驱动
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, username, password);
}
}
海报
0 条评论
169
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~