前言:因为需要正式做项目,了解到了连接池这个东西。在网上找了很多资料,发现都是大同小异,各种转载,看上去搜出来了几十个答案,结果很可能是同一个。并且大多都是基于框架的数据库连接池。可是我只是想采用MVC做一个不是很大的项目,不需要使用到框架啊。这可怎么办,最后没办法,弄清楚连接池的原理,配合网上的资料,自己写一个简单的吧(这里暂时不考虑多线程操作,后面会继续完善这个连接池,自己挖坑,后面慢慢补)
1、连接池是什么以及连接池的好处
这里想借用老师的例子,觉得非常的贴切。我是一个图书管理员(CPU),当需要有人来借书的时候(进行数据库操作),我首先需要去图书馆找到这本书(连接数据库),然后登记把书给借书的人(执行并返回执行结果),人们来还书的时候,我们再把书放回图书馆(关闭数据库)。这是我们普通的做法,这样的做法有一个问题是这样的,图书管理员在找书的时候需要花费10分钟(连接数据库),登记把书给借书的人(执行SQL语句)只需要1分钟。这就极大的降低了性能,因此就图书管理员就想了一个办法,我首先放一些书放在前台书桌上(连接池),然后别人来借书的时候(进行数据库操作的时候),我直接看书桌上还有没有书,如果有的话,直接登记就可以了,花费的时间约为1分钟,相对之前的借书流程提高了11倍。如果没有的话,我们再去图书馆找这本书(连接数据库)。在别人还书的时候,我们也不直接把书放回图书馆,而是放在书桌上(不关闭连接,放入连接池)。
2、简单连接池的具体实现
创建一个连接池,基本原理就是,我们先创建一堆数据库连接放在List中(初始化),在要进行连接的时候,我们判断是否连接池中还有连接,如果有就直接从连接池中获取,如果没有,我们再重新创建连接。并且我们使用完成以后也不要关闭,而是重新放回List中。
IDatabaseConnection接口文件
package DBPool;
import java.sql.Connection;
/**
* @author xiaoD
* @date 2017年11月22日 上午9:00:05
* Description: 定义一个接口,更换数据库的时候方便
*/
public interface IDatabaseConnection {
//初始化
public void init();
//取得连接
public Connection getConnection();
//关闭
public void close(Connection conn);
}
SQLServerHandler处理器
package DBPool;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* @author xiaoD
* @date 2017年11月22日 上午9:02:19
* Description:
*/
public class SQLServerHandler {
private static final String DBDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String DBURL = "jdbc:sqlserver://localhost:1433;DatabaseName=xiaoD";
private static final String USERNAME = "sa";
private static final String PASSWORD = "sql2008";
private Connection conn = null;
public Connection buildConnection() {
try {
Class.forName(DBDRIVER);
this.conn = DriverManager.getConnection(DBURL, USERNAME, PASSWORD);
}catch(Exception e) {
e.printStackTrace();
}
return conn;
}
}
SQLServerPool
package DB;
import java.sql.Connection;
import java.util.LinkedList;
/**
* @author xiaoD
* @date 2017年11月22日 下午2:49:38
* Description: 构建一个连接池
*/
public class SQLServerPool implements IDatabaseConnection{
//最小连接数
private static final int minCount = 1;
//最大连接数
private static final int maxCount = 10;
//连接池
private static final LinkedList<Connection> pools = new LinkedList<Connection>();
SQLServerHandler handler = new SQLServerHandler();
/**
* @author xiaoD
* @date 2017年11月22日 下午2:49:38
* Description: 重写init
*/
public void init() {
Connection conn = null;
try{
for(int i=0; i<minCount; i++) {
conn = handler.buildConnection();
pools.add(conn);
}
}catch(Exception e) {
e.printStackTrace();
}
}
/**
* @author xiaoD
* @date 2017年11月22日 下午2:49:38
* Description: 重写getConnection
*/
public synchronized Connection getConnection() {
Connection conn = null;
if(pools.size() == 0) {
conn = handler.buildConnection();
} else {
conn = pools.remove(0);
}
return conn;
}
/**
* @author xiaoD
* @date 2017年11月22日 下午2:49:38
* Description: 重写close
*/
public synchronized void close(Connection conn) {
if(pools.size() < maxCount) {
pools.add(conn);
}
System.out.println(pools);
}
}
测试类
package DB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @author xiaoD
* @date 2017年11月22日 下午2:52:00
* Description:
*/
public class DatabseTest {
static IDatabaseConnection SQLServer = new SQLServerPool();
public static void main(String args[]) {
SQLServer.init();
long start = System.currentTimeMillis();
for(int i=0; i<300; i++) {
test();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
private static void test() {
try{
Connection conn = SQLServer.getConnection();
String sql = "select * from users";
PreparedStatement pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
System.out.println(rs);
pst.close();
SQLServer.close(conn);
}catch(Exception e) {
e.printStackTrace();
}
}
}
---------------------
转载:https://blog.csdn.net/m0_37568521/article/details/78598766