数据库连接池

摘要

##概念

  • 介绍

    DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目。DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的。

  • 图解

简单连接池实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//模拟连接池
public class SimpleConnectionPool {
//存放链接对象的池
private static List<Connection> pool = Collections.synchronizedList(new ArrayList<Connection>());
//最开始初始化一些链接到池中
static{
for(int i=0;i<10;i++){
Connection conn = JdbcUtil.getConnection();
pool.add(conn);
}
}
//从池中获取一个链接
public static Connection getConnection(){
if(pool.size()>0){
return pool.remove(0);
}else{
throw new RuntimeException("服务器忙");
}
}
//用完后还回池中
public static void release(Connection conn){
pool.add(conn);
}
}

标准数据源(基于动态代理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//标准的数据源
public class MyDataSource implements DataSource {

private static List<Connection> pool = Collections.synchronizedList(new ArrayList<Connection>());
//最开始初始化一些链接到池中
static{
for(int i=0;i<10;i++){
Connection conn = JdbcUtil.getConnection();
pool.add(conn);
}
}

public Connection getConnection() throws SQLException {
if(pool.size()>0){
final Connection conn = pool.remove(0);//数据库驱动的
Connection proxyConn = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),
conn.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("close".equals(method.getName())){
//用户调用的是close方法:还回池中
return pool.add(conn);
}else{
//调用原来对象的对应方法
return method.invoke(conn, args);
}
}
});
return proxyConn;
}else{
throw new RuntimeException("连接池忙");
}
}

public PrintWriter getLogWriter() throws SQLException {
return null;
}

public void setLogWriter(PrintWriter out) throws SQLException {

}

public void setLoginTimeout(int seconds) throws SQLException {

}

public int getLoginTimeout() throws SQLException {
return 0;
}

public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}

public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}

public Connection getConnection(String username, String password)
throws SQLException {
return null;
}

}