- 浏览: 433300 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
springaop_springmvc:
apache lucene开源框架demo使用实例教程源代码下 ...
Java搜索工具——Lucene实例总结(一) -
chengang292214:
总结的不错
Web开发中的路径问题 -
liuyuanhui0301:
aka~
Java 归并排序(基于数组) -
IT人_:
不错
远程连接MySQL,防火墙阻止访问,解决办法 -
zhuchao_ko:
借鉴。
JNDI访问LDAP
连接工厂 ConnectionFactory
package myConnPool; import java.util.LinkedHashSet; import java.sql.*; import java.util.Iterator; public class ConnectionFactory { private static ConnectionFactory connFactory = null; private LinkedHashSet connPool = null;// 在使用的连接池 private LinkedHashSet freeConnPool = null;// 空闲连接池 private int maxConnCount = 4;//最大连接数 private int minConnCount = 2; // 最小连接数 private int current_conn_count = 0;// 当前连接数 private boolean isflag = false;// 是否创建工厂的标志 private ConnectionFactory(){} public ConnectionFactory(ConnectionParam param) throws SQLException { if (connFactory == null) { synchronized (ConnectionFactory.class) { if (connFactory == null) { connFactory=new ConnectionFactory(); connFactory.connPool = new LinkedHashSet(); connFactory.freeConnPool = new LinkedHashSet(); connFactory.maxConnCount = param.getMaxConn(); connFactory.minConnCount = param.getMinConn(); connFactory.isflag = true; try {// 初始化,创建minConnCount个连接 for (int i = 0; i < connFactory.minConnCount; i++) { _Connection _conn = _Connection .getConnection(connFactory); connFactory.freeConnPool.add(_conn);// 加入空闲连接池 connFactory.current_conn_count++; } } catch (Exception e) { e.printStackTrace(); } } } } } // 标志工厂是否已经创建 public boolean isCreate() { return connFactory.isflag; } /* 从连接池中取一个空闲的连接 * 先遍历空闲连接池,看看是否有空闲连接 * 如果能得到连接,得到连接后,从空闲连接池移除该链接,然后加入到当前连接池 * 判断连空闲连接池是否为空 * 如果空闲连接池为空,并且当前连接还没达到最大连接数,则创建新的连接,加入空闲连接池 * 然后检查当前连接池,把不再使用的连接归还给空闲连接池 * 最后判断到底有没有得到连接 * 如果没有得到连接,则再次遍历空闲连接池 */ public synchronized Connection getFreeConnection() throws SQLException { Connection conn = null; Iterator iter = connFactory.freeConnPool.iterator();// 获取空闲连接 while (iter.hasNext()) { _Connection _conn = (_Connection) iter.next(); if (!_conn.isFree()) {// 找到未用连接 conn = _conn.getFreeConnection(); _conn.setIsFree(true); connFactory.freeConnPool.remove(_conn);// 移出空闲区 connFactory.connPool.add(_conn);// 加入连接池 break; } } // 检查空闲池是否为空 if (connFactory.freeConnPool.isEmpty()) { // 再检查是否能够分配 if (connFactory.current_conn_count < connFactory.maxConnCount) { int newcount = 0; // 取得要建立的数目 if (connFactory.maxConnCount - connFactory.current_conn_count >= connFactory.minConnCount) { newcount = connFactory.minConnCount; } else { newcount = connFactory.maxConnCount - connFactory.current_conn_count; } for (int i = 0; i < newcount; i++) {// 创建连接 _Connection _conn = _Connection.getConnection(connFactory); connFactory.freeConnPool.add(_conn); connFactory.current_conn_count++; } } else {// 如果不能新建,检查是否有已经归还的连接 iter = connFactory.connPool.iterator(); while (iter.hasNext()) { _Connection _conn = (_Connection) iter.next(); if (!_conn.isFree()) { conn = _conn.getFreeConnection(); _conn.setIsFree(false); connFactory.connPool.remove(_conn); connFactory.freeConnPool.add(_conn); break; } } } } // 再次检查是否能分配连接 if (conn == null) { iter = connFactory.freeConnPool.iterator(); while (iter.hasNext()) { _Connection _conn = (_Connection) iter.next(); if (!_conn.isFree()) { conn = _conn.getFreeConnection(); _conn.setIsFree(true); connFactory.freeConnPool.remove(_conn); connFactory.connPool.add(_conn); break; } } if (conn == null)// 如果不能则说明无连接可用 throw new SQLException("没有可用的数据库连接"); } System.out.println("get connection"); return conn; } // 关闭该连接池中的所有数据库连接 public synchronized void close() throws SQLException { this.isflag = false; SQLException excp = null; // 关闭空闲池 Iterator iter = connFactory.freeConnPool.iterator(); while (iter.hasNext()) { try { ((_Connection) iter.next()).close(); System.out.println("close connection:free"); connFactory.current_conn_count--; } catch (Exception e) { if (e instanceof SQLException) excp = (SQLException) e; } } // 关闭在使用的连接池 iter = connFactory.connPool.iterator(); while (iter.hasNext()) { try { ((_Connection) iter.next()).close(); System.out.println("close connection:inused"); connFactory.current_conn_count--; } catch (Exception e) { if (e instanceof SQLException) excp = (SQLException) e; } } if (excp != null) throw excp; } }
数据连接代理类_Connection
package myConnPool; import java.lang.reflect.*; import java.sql.*; //定义数据库连接的代理类 public class _Connection implements InvocationHandler { private Connection conn = null;// 定义连接 private Statement statRef = null;// 定义监控连接创建的语句 private PreparedStatement prestatRef = null; private boolean isFree = false;// 数据库的忙状态 long lastAccessTime = 0;// 最后一次访问时间 // 定义要接管的函数的名字 String CREATESTATE = "createStatement"; String CLOSE = "close"; String PREPARESTATEMENT = "prepareStatement"; private _Connection() { try {// 创建连接 Class.forName(ConnectionParam.getInstance().getDriver()) .newInstance(); conn = DriverManager.getConnection(ConnectionParam.getInstance() .getUrl(), ConnectionParam.getInstance().getUser(), ConnectionParam.getInstance().getPassword()); DatabaseMetaData dm = null; dm = conn.getMetaData(); } catch (Exception e) { e.printStackTrace(); } } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null; // 判断是否调用了close的方法,如果调用close方法则把连接置为无用状态 if (CLOSE.equals(method.getName())) { // 设置不使用标志 setIsFree(false); // 检查是否有后续工作,清除该连接无用资源 if (statRef != null) statRef.close(); if (prestatRef != null) prestatRef.close(); return null; } // 判断是使用了createStatement语句 if (CREATESTATE.equals(method.getName())) { obj = method.invoke(conn, args); statRef = (Statement) obj;// 记录语句 return obj; } // 判断是使用了prepareStatement语句 if (PREPARESTATEMENT.equals(method.getName())) { obj = method.invoke(conn, args); prestatRef = (PreparedStatement) obj; return obj; } obj = method.invoke(conn, args); // 设置最后一次访问时间,以便及时清除超时的连接 lastAccessTime = System.currentTimeMillis(); return obj; } // 创建连接的工厂,只能让工厂调用 static public _Connection getConnection(ConnectionFactory factory) { if (factory.isCreate()) {// 判断是否正确初始化的工厂 _Connection _conn = new _Connection(); return _conn; } else return null; } public Connection getFreeConnection() { // 返回数据库连接conn的接管类,以便截住close方法 Connection conn2 = (Connection) Proxy.newProxyInstance(conn.getClass() .getClassLoader(), conn.getClass().getInterfaces(), this); return conn2; } // 该方法真正的关闭了数据库的连接 void close() throws SQLException { // 由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接 conn.close(); } public void setIsFree(boolean value) { isFree = value; } public boolean isFree() { return isFree; } }
连接参数类 ConnectionParam
package myConnPool; import java.io.Serializable; public class ConnectionParam implements Serializable { private static ConnectionParam connParam=null; private String driver; // 数据库驱动程序 private String url; // 数据连接的URL private String user; // 数据库用户名 private String password; // 数据库密码 private int MaxConnectionCount = 4;// 最大连接数 private int MinConnectionCount = 2;// 最小连接数 private ConnectionParam(){} public static ConnectionParam getInstance(){ if(connParam==null){ connParam=new ConnectionParam(); } return connParam; } public String getDriver() { return driver; } public String getPassword() { return password; } public String getUrl() { return url; } public String getUser() { return user; } public int getMaxConn() { return this.MaxConnectionCount; } public int getMinConn() { return this.MinConnectionCount; } public void setDriver(String driver) { this.driver = driver; } public void setPassword(String password) { this.password = password; } public void setUrl(String url) { this.url = url; } public void setUser(String user) { this.user = user; } public void setMaxConn(int value) { this.MaxConnectionCount = value; } public void setMinConn(int value) { this.MinConnectionCount = value; } }
测试类
package myConnPool; import java.sql.*; public class testmypool { public static void main(String[] args) { String user = "root"; String password = "root"; String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost/authorization"; ConnectionParam param = ConnectionParam.getInstance(); param.setDriver(driver); param.setUrl(url); param.setUser(user); param.setPassword(password); param.setMaxConn(4); param.setMinConn(2); ConnectionFactory cf = null; try { cf = new ConnectionFactory(param); ConnectionFactory cf1 = new ConnectionFactory(param); Connection conn1 = null; long time = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { conn1 = cf.getFreeConnection(); Statement stmt = conn1.createStatement(); ResultSet rs = stmt.executeQuery("select * from function"); if (rs.next()) { System.out.println("conn1 y"); } else { System.out.println("conn1 n"); } conn1.close(); } System.out.println("pool:" + (System.currentTimeMillis() - time)); time = System.currentTimeMillis(); Class.forName(param.getDriver()).newInstance(); for (int i = 0; i < 10; i++) { conn1 = DriverManager.getConnection(param.getUrl(), param .getUser(), param.getPassword()); Statement stmt = conn1.createStatement(); ResultSet rs = stmt.executeQuery("select * from function"); if (rs.next()) { System.out.println("conn1 y"); } else { System.out.println("conn1 n"); } conn1.close(); } System.out .println("no pool:" + (System.currentTimeMillis() - time)); } catch (Exception e) { e.printStackTrace(); } finally { try { cf.close(); } catch (Exception e) { e.printStackTrace(); } } } }
- myConnPool.rar (4.1 KB)
- 下载次数: 8
发表评论
-
Test
2011-07-30 11:47 0Testtse -
DB2操作
2011-07-27 15:25 1366DB2 命令行CLP下的操作 注: 蓝色字体表示变量,可适当 ... -
数据库H2 介绍
2011-03-18 17:40 8981. 下载地址 http://www. ... -
一些sql题
2011-03-18 17:17 13291.触发器的作用? 答 ... -
Mysql 操作
2011-02-22 10:40 796连接:mysql -h127.0.0.1 -uroot -p1 ... -
数据库连接池
2010-05-12 21:39 939连接工厂 ConnectionFactory ... -
远程连接MySQL,防火墙阻止访问,解决办法
2010-04-25 01:34 8399远程连接MySQL,防火墙阻止访问,解决办法 1.在服务器A ...
相关推荐
Umi-OCR-main.zip
基于springboot+Web的毕业设计选题系统源码数据库文档.zip
基于springboot校外兼职教师考勤管理系统源码数据库文档.zip
58商铺全新UI试客试用平台网站源码
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于SpringBoot的口腔诊所系统源码数据库文档.zip
数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/143956923
3-240P2162218.zip
网络安全 基于Qt创建的Linux系统下的浏览器.zip
C++ 类和对象:多态-练习题目2(制作咖啡和茶叶)
基于springboot+J2EE在线项目管理与任务分配中的应用源码数据库文档.zip
简介本项目提供了一个在51单片机上运行的简单操作系统,旨在帮助学习者深入理解操作系统的基本原理和任务调度机制。该操作系统通过汇编和C语言编写,实现了任务调度、中断处理等核心功能,并提供了详细的源代码和注释,方便学习和实践。
本文将深度卷积神经网络(CNN)设计实现一个复杂结构的生成模型,旨在通过多阶段的编码器-解码器结构,能够有效地将灰度图像转换为彩色图像。最后,本文将实现一个简单的Web应用,用户可以通过上传灰度图像,应用会使用预训练的Caffe模型对其进行颜色化,并将结果返回给用户。 1.模型设计:模型由多个卷积层、ReLU激活函数和批归一化层组成,通过前向传播函数将输入的灰度图像(L通道)转换为彩色图像(ab通道)。如果指定了 pretrained=True,则会自动下载并加载预训练的模型权重。 2. 系统通过Flask框架提供了一个Web应用,用户可以上传灰度图像,系统会自动将其转换为彩色图像,并在网页上显示结果。整个过程包括文件验证、图像处理、颜色化预测和结果展示,具有较高的实用性和用户体验。
一个JAVA图形化的、联网的五子棋游戏.zip javaweb
KWDB 是一款面向 【AIoT 场景】的【分布式多模数据库】,支持在同一实例同时建立时序库和关系库并融合处理多模数据,具备千万级设备接入、百万级数据秒级写入、亿级数据秒级读取等时序数据高效处理能力,具有稳定安全、高可用、易运维等特点。
页面数量:7页 网页主题:网站模板、酒店网站模板、官方网站模板 网页页面:首页、关于我们、相关服务、服务详情、在线博客、博客详情、在线留言 页面实现元素:加载动画、滚动加载、主题切换、导航栏 、轮播图、图文列表、图片切换、 文字列表、 按钮悬停、图片悬停、表单 实现技术:HTML、CSS 、JQuery 源码样式及js文件均分开存放,所有内容仅供初学者学习参考
内容概要:本文档提供了详细的 Neo4j 安装与配置指南,涵盖 Windows、Linux 和 Mac 系统的安装步骤。具体包括下载、安装、启动服务、修改配置文件(如端口配置、远程访问和内存限制)、设置管理员密码以及基本的 Cypher 查询语言使用方法。同时,还提供了一些常见问题及其解决方案。 适合人群:数据库管理员、软件开发人员、系统管理员。 使用场景及目标:①帮助初学者快速掌握 Neo4j 的安装与配置;②适用于需要搭建和使用图数据库的项目;③为已有用户解决常见问题。 其他说明:本文档不仅包含了基础的安装和配置流程,还提供了实际操作中可能遇到的问题及其解决方法,有助于提高使用者的实际操作能力。
基于SpringBoot+Vue的软件产品展示销售系统源码数据库文档.zip
《书戴嵩画牛》教学课件.pptx
20届智能车 【项目资源】:包含前端、后端、移动开发、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源,毕业设计等各种技术项目的源码。包括C++、Java、python、web、C#、EDA等项目的源码。 【适用人群】:适用于希望学习不同技术领域的初学者或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。