简单模拟实现数据库连接池
实例1:
package com.bijian.thread; public class DB { //private static final int MAX_COUNT = 10; private static final DB instance = new DB(); private int count = 0; private int maxCount = 0; private DB() { } public static DB getInstance() { return instance; } public synchronized Connection getConnection() { Connection conn = new Connection(); count++; if (count > maxCount) { maxCount = count; System.out.println("(MAX)DB Connection count = " + maxCount); } return conn; } public synchronized void close() { count--; //System.out.println("(Close)DB Connection count = " + count); } }
package com.bijian.thread; public class DBUtil { private static Pool pool = new Pool(); public static Connection getConnection() throws Exception { //return DB.getInstance().getConnection(); Connection conn = null; conn = pool.getConnection(); return conn; } public static void close(Connection conn) { //DB.getInstance().close(); pool.back(conn); } }
package com.bijian.thread; public class Connection { public Connection() { try { Thread.sleep(100); } catch(Exception e) { e.printStackTrace(); } } public void execute(String sql) { try { Thread.sleep((int) Math.random() * 50); } catch(Exception e) { e.printStackTrace(); } } }
package com.bijian.thread; import java.util.ArrayList; import java.util.List; public class Pool { private static final int POOL_SIZE = 10; private List<Connection> connections = new ArrayList<Connection>(); public Pool() { for(int i = 0; i < POOL_SIZE; i++) { connections.add(DB.getInstance().getConnection()); } } public synchronized Connection getConnection() throws Exception { Connection conn = null; if (connections.size() > 0) { conn = connections.get(0); connections.remove(0); } else { wait(400); if (connections.size() > 0) { conn = connections.get(0); connections.remove(0); } else { throw new Exception("Connection Pool is empty!"); } } return conn; } public synchronized void back(Connection conn) { connections.add(conn); notify(); } }
package com.bijian.thread; public class Guest implements Runnable { private String name; public Guest(String name) { this.name = name; } @Override public void run() { Connection conn = null; try { conn = DBUtil.getConnection(); conn.execute(""); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { DBUtil.close(conn); } } System.out.println(name + " executed."); } }
package com.bijian.thread; public class Main { private static final int MAX_GUEST = 100; /** * @param args */ public static void main(String[] args) { for (int i = 0; i < MAX_GUEST; i++) { new Thread(new Guest("Guest" + i)).start(); } } }
运行结果:
(MAX)DB Connection count = 1 (MAX)DB Connection count = 2 (MAX)DB Connection count = 3 (MAX)DB Connection count = 4 (MAX)DB Connection count = 5 (MAX)DB Connection count = 6 (MAX)DB Connection count = 7 (MAX)DB Connection count = 8 (MAX)DB Connection count = 9 (MAX)DB Connection count = 10 Guest75 executed. Guest74 executed. Guest73 executed. Guest79 executed. Guest81 executed. Connection Pool is empty! Guest1 executed. java.lang.Exception: Connection Pool is empty!Guest80 executed. Guest0 executed. Guest4 executed. Guest82 executed. Guest77 executed. Guest72 executed. Guest66 executed. Guest89 executed. Guest7 executed. Guest83 executed. Guest69 executed. Guest55 executed. Guest76 executed. Guest99 executed. Guest71 executed. Guest59 executed. Guest43 executed. Guest41 executed. Guest39 executed. Guest92 executed. Guest3 executed. Guest5 executed. Guest87 executed. Guest34 executed. Guest33 executed. Guest35 executed. Guest28 executed. Guest36 executed. at com.bijian.thread.Pool.getConnection(Pool.java:31) at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) at com.bijian.thread.Guest.run(Guest.java:16) at java.lang.Thread.run(Thread.java:619) Guest98 executed. Guest42 executed. Guest15 executed. Guest16 executed. Guest46 executed. Guest38 executed. Guest40 executed. Guest44 executed. Guest94 executed. Guest45 executed. Guest51 executed. Guest49 executed. Guest63 executed. Guest93 executed. Guest57 executed. Guest85 executed. Guest50 executed. Guest60 executed. Guest56 executed. Guest58 executed. Guest86 executed. Guest68 executed. Guest70 executed. Connection Pool is empty! Connection Pool is empty! java.lang.Exception: Connection Pool is empty! at com.bijian.thread.Pool.getConnection(Pool.java:31) Guest84 executed. at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) at com.bijian.thread.Guest.run(Guest.java:16) Connection Pool is empty! at java.lang.Thread.run(Thread.java:619) Connection Pool is empty! Guest52 executed. java.lang.Exception: Connection Pool is empty! Connection Pool is empty! Connection Pool is empty! Guest65 executed. at com.bijian.thread.Pool.getConnection(Pool.java:31) at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) at com.bijian.thread.Guest.run(Guest.java:16) Connection Pool is empty! Guest2 executed. at java.lang.Thread.run(Thread.java:619) Guest6 executed. Guest67 executed. java.lang.Exception: Connection Pool is empty! Guest90 executed. Guest88 executed. at com.bijian.thread.Pool.getConnection(Pool.java:31) at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) at com.bijian.thread.Guest.run(Guest.java:16) at java.lang.Thread.run(Thread.java:619) Guest64 executed. Guest8 executed. Guest54 executed. Guest78 executed. java.lang.Exception: Connection Pool is empty! at com.bijian.thread.Pool.getConnection(Pool.java:31) Guest13 executed. at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) at com.bijian.thread.Guest.run(Guest.java:16) at java.lang.Thread.run(Thread.java:619) java.lang.Exception: Connection Pool is empty! Guest12 executed. Guest17 executed. Guest11 executed. Guest10 executed. Guest47 executed. Guest9 executed. Guest48 executed. at com.bijian.thread.Pool.getConnection(Pool.java:31) at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) Guest95 executed. Guest22 executed. at com.bijian.thread.Guest.run(Guest.java:16) at java.lang.Thread.run(Thread.java:619)Guest18 executed. Guest14 executed. Guest30 executed. Guest96 executed. Guest19 executed. Guest23 executed. Guest31 executed. java.lang.Exception: Connection Pool is empty! at com.bijian.thread.Pool.getConnection(Pool.java:31) at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) at com.bijian.thread.Guest.run(Guest.java:16) at java.lang.Thread.run(Thread.java:619) java.lang.Exception: Connection Pool is empty! Guest20 executed. Guest27 executed. at com.bijian.thread.Pool.getConnection(Pool.java:31) at com.bijian.thread.DBUtil.getConnection(DBUtil.java:10) Guest24 executed. at com.bijian.thread.Guest.run(Guest.java:16) Guest97 executed. at java.lang.Thread.run(Thread.java:619) Guest25 executed. Guest21 executed. Guest32 executed. Guest29 executed. Guest26 executed. Guest37 executed. Guest62 executed. Guest91 executed. Guest61 executed. Guest53 executed.
通过实例1简单模拟实现了数据库的连接池,但使用者获取连接时,如果连接池中没有连接时,wait 400毫秒,再次获取,如果获取不到直接报错。
修改实例1的Pool.java类(如果连接池中没有连接时,wait 400毫秒,再次获取,如果再获取不到,再wait 400毫秒……直到共wait 2分钟[当然,具体共wait多少分钟,可以具体修改]),如下实例2所示:
实例2:
package com.bijian.thread; import java.util.ArrayList; import java.util.List; public class Pool { private static final int POOL_SIZE = 10; private List<Connection> connections = new ArrayList<Connection>(); public Pool() { for(int i = 0; i < POOL_SIZE; i++) { connections.add(DB.getInstance().getConnection()); } } public synchronized Connection getConnection() throws Exception { Connection conn = null; for(int i=0;i<60*1000*2;i++) { if(connections.size() > 0) { conn = connections.get(0); connections.remove(0); break; }else { wait(400); i+=400; } } if(conn == null) { throw new Exception("Connection Pool is empty!"); } return conn; } public synchronized void back(Connection conn) { connections.add(conn); notify(); } }
运行结果(对于此模拟实例,获取连接时共wait 2分钟,所有的连接应该都能正常获取到连接,不会抛出Connection Pool is empty!的异常):
(MAX)DB Connection count = 1 (MAX)DB Connection count = 2 (MAX)DB Connection count = 3 (MAX)DB Connection count = 4 (MAX)DB Connection count = 5 (MAX)DB Connection count = 6 (MAX)DB Connection count = 7 (MAX)DB Connection count = 8 (MAX)DB Connection count = 9 (MAX)DB Connection count = 10 Guest0 executed. Guest46 executed. Guest1 executed. Guest79 executed. Guest88 executed. Guest3 executed. Guest37 executed. Guest92 executed. Guest32 executed. Guest85 executed. Guest74 executed. Guest55 executed. Guest14 executed. Guest96 executed. Guest52 executed. Guest95 executed. Guest81 executed. Guest27 executed. Guest80 executed. Guest84 executed. Guest25 executed. Guest44 executed. Guest45 executed. Guest51 executed. Guest50 executed. Guest24 executed. Guest63 executed. Guest7 executed. Guest41 executed. Guest23 executed. Guest60 executed. Guest94 executed. Guest58 executed. Guest59 executed. Guest54 executed. Guest72 executed. Guest56 executed. Guest53 executed. Guest73 executed. Guest69 executed. Guest71 executed. Guest89 executed. Guest70 executed. Guest91 executed. Guest65 executed. Guest93 executed. Guest68 executed. Guest67 executed. Guest90 executed. Guest66 executed. Guest64 executed. Guest34 executed. Guest36 executed. Guest33 executed. Guest35 executed. Guest78 executed. Guest83 executed. Guest86 executed. Guest82 executed. Guest28 executed. Guest87 executed. Guest20 executed. Guest19 executed. Guest77 executed. Guest22 executed. Guest29 executed. Guest26 executed. Guest30 executed. Guest2 executed. Guest61 executed. Guest62 executed. Guest10 executed. Guest47 executed. Guest9 executed. Guest8 executed. Guest57 executed. Guest16 executed. Guest17 executed. Guest76 executed. Guest75 executed. Guest6 executed. Guest4 executed. Guest5 executed. Guest43 executed. Guest21 executed. Guest18 executed. Guest42 executed. Guest15 executed. Guest49 executed. Guest13 executed. Guest12 executed. Guest48 executed. Guest11 executed. Guest98 executed. Guest39 executed. Guest40 executed. Guest97 executed. Guest99 executed. Guest31 executed. Guest38 executed.
相关推荐
java练习之模拟数据库连接池,对数据库连接池有个初步的认识!
用java实现的简易的数据库连接池及其管理 课程设计 编写一关于Microsoft Access数据库连接池及其管理的相关类,要求能从XML配置文件中读取该数据库驱动程序,数据库名,连接池最大连接数,最多等待用户数,查询...
java实现数据库连接池的模拟
面向对象软件设计是当今软件设计模式的潮流,而基于面向对象软件设计方法的数据库连接池是其中的一个重要的研究课题。本文首先介绍了传统连接、tomcat下连接池和hibernate下连接池的基本原理,然后在此基础上提出了...
46.请写一个java程序实现数据库连接池功能? 用一个自己的类实现Connection接口太麻烦! 主要是连接(Connection)的close()方法,从连接池得到的是一个代理对象,过滤Connection的close()方法。你还能找到其他方法...
Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 1.数据库连接池 2.Durid介绍(官方文档) 3.编码,问题,常规并发操作 3.1.JDBCUtil....
实施的重点是具有其可用的连接数量通过设置连接池POOL_SIZE在PGPool.h文件。 在main.cpp ,它模拟创建一个新的10个线程,其中包含来自池的每个可用连接,以执行与DB相关的任务。 理想情况下,此时的并发模型取决于您...
第十四节 编写一个简单的数据库连接池 74 14.1 为什么要使用数据库连接池 74 14.2 数据库连接池雏形 74 14.2 数据库连接池优化 77 14.2.1 对线程池加锁 77 14.2.2 连接不够用时抛出异常 77 14.3 数据库连接池之代理...
java三层架构和jdbc数据库连接池连接mysql数据库实现
基于Java图形界面Swing和网络编程Socket,以及数据访问JDBC使用Druid数据库连接池,使用实现的一个简单的仿QQ聊天软件,支持客户端多次运行模拟多个用户在线,支持多个用户相互在线聊天,好友关系及用户信息采用MySQL...
Java学习日志(三十三)JDBC预处理对象登陆注册案例模拟:用户注入攻击数据库解决用户注入式攻击PreparedStatement对象对数据库表进行增删改查连接池连接池的原理连接池的规范接口DataSource创建并测试C3P0连接池的...
基于springcloud+vue+oAuth2.0全家桶实战... 数据库连接池:Alibaba Druid 日志管理:Logback 前端框架:Vue全家桶以及相关组件 三方服务: 邮件服务、阿里云短信服务、七牛云文件服务、钉钉机器人服务、高德地图API
b.JDBC+dbcp连接池 连接池好处: 1.避免频繁创建和销毁connection 2.将connection控制在一定数量范围内 保证服务器稳定. c.客户端采用jQuery+Ajax (4)数据库设计(可以使用PowerDesign工具)
Spring Cloud 实战项目 项目介绍 功能点: 模拟商城,完整的购物流程、后端运营平台对前端业务的支撑,和对项目的运维,有各项的监控指标和运维指标。 技术点: 核心技术为springcloud+vue两... 数据库连接池:Alibab
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
spring cloud + vue + oAuth2.0全家桶实战,...数据库连接池:Alibaba Druid 日志管理:Logback 前端框架:Vue全家桶以及相关组件 三方服务: 邮件服务、阿里云短信服务、七牛云文件服务、钉钉机器人服务、高德地图API
共三部分: 1、XML读取,用于配置文件读取 2、模拟SPRING IOC 3、模拟STRUTS ...练习:数据库连接池、XML读取、SPRING IOC、STRUTS都模拟了代码。现在可以使用这四部分代码实践在项目中了! 代码仅作参考
模拟当当部分功能实现一个电子商务系统。 主要功能如下: 1)用户管理模块(user) 用户登录,用户注册,用户权限(登录检查) 2)产品浏览模块(main) 主界面,分类浏览界面,产品详细界面 3)购物车模块...
环境配置(Tomcat与JDK的版本使用问题,DBCP/C3P0数据库连接池的配置问题) 2. 登录(会话)维持————session/cookies 3. 分页显示————PageModel/jdbc-mysql查 ### 实现图 ![主页]...
springboot+Mybatis-plus搭建 redis、zookeeper、mq集群 redis缓存、jetCache缓存 RabbitMq消息通知、死信、延迟队列使用 ...数据库连接池Druid使用 MapStruct实体转化工具使用 然后部署时候CDN之类的使用