Java:实现简单的连接池
来源:互联网 发布:湖南教师网络研修平台 编辑:程序博客网 时间:2024/06/05 00:36
数据库连接是非常珍贵的资源,能够复用则尽量复用。这里我们实现数据库连接。
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;public class ConnectionPool { private List<ConnectionPair> connectionPairs; private static final int DEFAULT_SIZE = 16; private int size; public ConnectionPool(String url, String username, String password) { connectionPairs = new ArrayList<>(DEFAULT_SIZE); size = DEFAULT_SIZE; try { Class.forName("com.mysql.jdbc.Driver"); for (int i = 0; i < size; i++) { ConnectionPair pair = new ConnectionPair(); pair.connection = DriverManager.getConnection(url, username, password); pair.isAvailable = true; connectionPairs.add(pair); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } // 同步获取connection,如果当前队列没有可用的connection,则阻塞 public synchronized Connection getConnectionSync() { synchronized (this) { for (int i = 0; i < size; i++) { ConnectionPair pair = connectionPairs.get(i); if (pair.isAvailable) { pair.isAvailable = false; return pair.connection; } } // 进入阻塞态,等待可用的connection // 可以用while(true)代替,但是while(true)消耗CPU运算 synchronized (this) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < size; i++) { ConnectionPair pair = connectionPairs.get(i); if (pair.isAvailable) { return pair.connection; } } return null; } } public synchronized Connection getConnection() { for (int i = 0; i < size; i++) { ConnectionPair pair = connectionPairs.get(i); if (pair.isAvailable) { pair.isAvailable = false; return pair.connection; } } return null; } public void releaseConnection(Connection connection) { for (int i = 0; i < size; i++) { ConnectionPair pair = connectionPairs.get(i); if (pair.connection == connection) { pair.isAvailable = true; synchronized (this) { this.notifyAll(); } break; } } } public void releaseAll() { for (int i = 0; i < size; i++) { try { connectionPairs.get(i).connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } private class ConnectionPair { Connection connection; boolean isAvailable; }}
这里实现了getConnectionSync()和getConnection()方法。
我们来做下测试:
public class MainClass { public static void main(String[] args) throws Exception { ConnectionPool pool = new ConnectionPool( "jdbc:mysql://localhost:3306/mysql", "root", ""); for (int i = 0; i < 35; i++) { Connection connection = pool.getConnectionSync(); final int j = i; new Thread(() -> { System.out.println("获取了第" + j + "个连接:" + connection); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } pool.releaseConnection(connection); System.out.println("释放了第" + j + "个连接:" + connection); }).start(); } pool.releaseAll(); }}
阅读全文
0 0
- java 连接池的简单实现
- Java:实现简单的连接池
- 简单JDBC连接池的实现
- JDBC实现简单的连接池代码
- JDBC连接池的简单实现
- JDBC连接池的简单实现
- HttpClient 连接池的简单实现
- java连接池的实现
- java 关于socket编程实现简单的c/s连接
- Java数据结构之简单的连接点(link)实现
- redis java客户端Jedis 实现 连接池 + 简单的负载均衡
- 黑马 总结二:Java 数据连接池简单实现
- TCP连接的简单实现
- 简单的Java连接数据库
- java简单的连接redies
- java连接MySql和Oracle简单实现
- JAVA 简单使用JDBC实现连接数据
- java中连接池的实现
- 《深入理解计算机系统(原书第2版)》pdf
- 如何将自己在github写的android library开源,让大家依赖使用
- 继续const用法
- Latex 参考文献上标
- Trafodion Troubleshooting
- Java:实现简单的连接池
- struts2.xml配置详解
- spring+myBatisi实现多数据源动态切换
- layer-------弹出层参数介绍
- 再谈java的内存泄露
- Hive SQL执行计划深度解析
- Android广播机制,BroadcastReceiver
- SwipeRefreshLayout 嵌套 ListView 滑动问题
- c中的const与c++中的const