如何在Java项目中模拟一个数据库连接池

本文章向大家介绍如何在Java项目中模拟一个数据库连接池,主要包括如何在Java项目中模拟一个数据库连接池的使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java的特点有哪些

Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。 3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

由于 java.sql.Connection 只是一个接口,最终实现是由数据库驱动提供方来实现,考虑到本例只是演示,我们通过动态代理构造一个 Connection,该 Connection 的代理仅仅是在调用 commit() 方法时休眠 100 毫秒

public class ConnectionDriver {   static class ConnectionHandler implements InvocationHandler {     @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {       if ("commit".equals(method.getName())) {         TimeUnit.MICROSECONDS.sleep(100);       }       return null;     }   }   /**    * 创建一个 Connection 的代理,在 commit 时休眠 100 毫秒    */   public static Connection createConnection() {     return (Connection) Proxy.newProxyInstance(ConnectionDriver.class.getClassLoader(),         new Class<?>[]{Connection.class}, new ConnectionHandler());   } }

接下来是线程池的实现。本例通过一个双向队列来维护连接,调用方需要先调用 fetchConnection(long) 方法来指定在多少毫秒内超时获取连接,当连接使用完成后,需要调用 releaseConnection(Connection) 方法将连接放回线程池

public class ConnectionPool {   private final LinkedList<Connection> pool = new LinkedList<>();   public ConnectionPool(int initialSize) {     // 初始化连接的最大上限     if (initialSize > 0) {       for (int i = 0; i < initialSize; i++) {         pool.addLast(ConnectionDriver.createConnection());       }     }   }   public void releaseConnection(Connection connection) {     if (connection != null) {       synchronized (pool) {         /* 连接释放后需要进行通知          * 这样其他消费者就能知道连接池已经归还了一个连接          */         pool.addLast(connection);         pool.notifyAll();       }     }   }   /**    * 在给定毫秒时间内获取连接    */   public Connection fetchConnection(long mills) throws InterruptedException {     synchronized (pool) {       // 完全超时       if (mills < 0) {         while (pool.isEmpty()) {           pool.wait();         }         return pool.removeFirst();       } else {         long future = System.currentTimeMillis() + mills;         long remaining = mills;         while (pool.isEmpty() && remaining > 0) {           pool.wait(remaining);           remaining = future - System.currentTimeMillis();         }         Connection result = null;         if (!pool.isEmpty()) {           result = pool.removeFirst();         }         return result;       }     }   } }

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。