数据库连接池的基本使用
来源:互联网 发布:unity3d将base64转图片 编辑:程序博客网 时间:2024/05/15 08:39
首先创建一个类管理连接池,对连接进行获取以及分配
ConnectionPool.java
package jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;public class ConnectionPool { List<Connection> connections=new ArrayList<Connection>(); int size;//连接池容量 public ConnectionPool(int size) { this.size=size; init(); } private void init() { // 不能使用try-with-resource的方式创建连接,因为这些连接要放到连接池中备用 try { Class.forName("com.mysql.jdbc.Driver"); for(int i=0; i<size;i++) { Connection connection=DriverManager.getConnection ("jdbc:mysql://127.0.0.1:3306/study?characterEncoding=UTF-8", "root", "joey"); connections.add(connection); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } /** * 从连接池中获取连接 * @return */ public synchronized Connection getConnection() { while(connections.isEmpty()) { // 如果连接池中没有可用连接, 让线程等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 从连接池中获取一个连接 Connection connection=connections.remove(0); return connection; } /** * 返回连接给连接池,并通知其它线程(有可用连接) * @param connection */ public synchronized void returnConnection(Connection connection) { connections.add(connection); this.notifyAll(); }}
测试类中创建多线程虚拟任务,利用连接池中的连接完成
ConnectionPoolTest.java
package jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;public class ConnectionPoolTest { public static void main(String[] args) { long start = System.currentTimeMillis(); // 通过连接池的管理,让多线程任务可以循环利用连接资源 ConnectionPool connectionPool = new ConnectionPool(10); for (int i = 0; i < 100; i++) { new WorkingThread("working thread" + i, connectionPool).start(); } // 直接发起多线程任务/* for (int i = 0; i < 100; i++) { new WorkingThread2("working thread" + i).start(); }*/ long end = System.currentTimeMillis(); System.out.println("耗时: " + (end - start)); }}class WorkingThread extends Thread { private ConnectionPool connectionPool; public WorkingThread(String name, ConnectionPool connectionPool) { super(name); this.connectionPool = connectionPool; } @Override public void run() { Connection connection = connectionPool.getConnection(); System.out.println(this.getName() + ":\t获取了一个连接,并开始工作"); try (Statement statement = connection.createStatement()) { // 模拟耗时一秒的数据库SQL语句 Thread.sleep(1000); statement.execute("select * from employee;"); } catch (SQLException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } connectionPool.returnConnection(connection); System.out.println(this.getName() + ":\t结束工作,并返回连接"); }}class WorkingThread2 extends Thread { public WorkingThread2(String name) { super(name); } @Override public void run() { System.out.println(this.getName() + ":\t获取了一个连接,并开始工作"); try (Connection connection = DriverManager .getConnection("jdbc:mysql://127.0.0.1:3306/study?characterEncoding=UTF-8", "root", "joey"); Statement statement = connection.createStatement()) { // 模拟耗时一秒的数据库SQL语句 Thread.sleep(1000); statement.execute("select * from employee;"); } catch (SQLException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.getName() + ":\t结束工作,并返回连接"); }}
--主线程中的耗时计算不准确??
阅读全文
0 0
- 数据库连接池的基本使用
- C3P0数据库连接池的基本使用
- 数据库连接池的基本思想
- DBCP数据库连接池笔记-基本使用
- 数据库连接池的使用
- 数据库连接池的使用
- 数据库连接池的使用
- 数据库连接池的使用
- 一个基本成熟的数据库连接池
- 一个基本成熟的数据库连接池
- dataSource数据库连接池的使用
- dbcp数据库连接池的使用
- 数据库连接池使用的优点
- 数据库连接池libzdb的使用
- c3p0数据库连接池的使用
- oracle数据库连接池的使用
- DBCP数据库连接池的使用
- DBCP数据库连接池的使用
- Spring Boot干货——(五)JdbcTemplates访问数据库
- Assign Cookies
- matlab中fix, floor, ceil, round 函数的使用方法
- 416. Partition Equal Subset Sum (dp)
- 经典指标:SAR算法和应用
- 数据库连接池的基本使用
- JDK环境变量配置
- python编程中的if __name__ == 'main': 的作用和原理
- 二分图图匹配
- 谷歌 Pixel 2 及 Pixel XL 2 参数曝光,预计最早9月面市
- #define 宏的一些使用
- 亚马逊Alexa语音平台已拥有超过15000项技能应用,稳居智能语音排行榜第一
- APIO抢掠计划(浅谈Tarjan——(4))
- 程序员平常加班严重,如何有效率的提升自己?