锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【Java面试题】数据库连接池Java代码实现

时间:2023-02-12 22:30:00 mlc连接器

今天复习数据库连接池的实现

优秀博客:http://blog..net/mlc1218559742/article/details/54955965

http://www..com/xdp-gacl/p/4002804.html

代码

/**

* 定制连接池, 管理连接

* 代码实现:

1. MyPool.java 连接池类,

2. 指定全局参数: 初始化数目、最大连接数、当前连接、 连接池集合

3. 构造函数:循环创建三个连接

4. 写一个创建连接的方法

5. 获取连接

------> 判断: 池中有连接, 直接拿

------> 池中没有连接,

------> 判断是否达到最大连接数; 达到,抛出异常;未达到最大连接数,

创造新的连接

6. 释放连接

-------> 连接放回集合中(..)

*

*/

public class MyPool {

private int init_count = 3;// 初始化连接数

private int max_count = 6;// 最大连接数

private int current_count = 0; // 记录当前使用的连接数

// 连接池 (存储所有初始连接)

private LinkedList pool = new LinkedList();

//1. 构造函数中,初始化连接放入连接池

public MyPool() {

// 初始化连接

for (int i=0; i

// 记录当前连接数

current_count ;

// 创建原始连接对象

Connection con = createConnection();

// 将连接添加到连接池中

pool.addLast(con);

}

}

//2. 创建新的连接方法

private Connection createConnection(){

try {

Class.forName("com.mysql.jdbc.Driver");

// 原始的目标对象

final Connection con = DriverManager.getConnection("jdbc:mysql:///jdbc_demo", "root", "root");

/**********对con对象代理**************/

// 对con创建其代理对象

Connection proxy = (Connection) Proxy.newProxyInstance(

con.getClass().getClassLoader(), // 类加载器

//con.getClass().getInterfaces(), // 当目标对象是一个特定的类别时,但在这里con是一个接口

new Class[]{Connection.class}, // 实现目标对象的接口

new InvocationHandler() {// 当调用con对象方法时, 事务处理器自动触发

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

// 方法返回值

Object result = null;

// 目前执行方法的方法名称

String methodName = method.getName();

// 判断应当执行close方法时,将连接放入连接池

if ("close".equals(methodName)) {

System.out.println("begin:当前执行close方法开始!");

// 连接到连接池中

pool.addLast(con);

System.out.println("end: 目前连接已放入连接池!");

} else {

// 调用目标对象法

result = method.invoke(con, args);

}

return result;

}

}

);

return proxy;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

//3. 获取连接

public Connection getConnection(){

// 3.1 判断连接池中是否有连接, 如果有连接,直接从连接池中取出

if (pool.size() > 0){

return pool.removeFirst();

}

// 3.2 连接池中没有连接: 判断,如果没有达到最大连接数,创建;

if (current_count < max_count) {

// 记录当前使用的连接数

current_count ;

// 创建连接

return createConnection();

}

// 3.3 如果最大连接数已经达到,则抛出异常

throw new RuntimeException("目前连接已达到最大连接数 !");

}

//4. 释放连接

public void realeaseConnection(Connection con) {

// 4.1 判断: 如果池的数量小于初始连接,则放入池中

if (pool.size() < init_count){

pool.addLast(con);

} else {

try {

// 4.2 关闭

current_count--;

con.close();

} catch (SQLException e) {

throw new RuntimeException(e);

}

}

}

public static void main(String[] args) throws SQLException {

MyPool pool = new MyPool();

System.out.println("当前连接: " pool.current_count); // 3

// 使用连接

pool.getConnection();

pool.getConnection();

Connection con4 = pool.getConnection();

Connection con3 = pool.getConnection();

Connection con2 = pool.getConnection();

Connection con1 = pool.getConnection();

// 释放连接, 连接放回连接池

//pool.realeaseConnection(con1);

/*

* 希望:关闭连接时,将连接放入连接池!【调用时Connection接口的close希望在方法上触发pool.addLast(con);操作】

* 将连接放入连接池中

* 解决1:实现Connection接口,重写close方法

* 解决方案2:动态代理

*/

con1.close();

// 再获取

pool.getConnection();

System.out.println("连接池:" pool.pool.size()); // 0

System.out.println("当前连接: " pool.current_count); // 3

}

}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章