- 浏览: 338724 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
pacoson:
感谢楼主。请受小生一拜。
ANT预编译JSP -
zhuhongming123:
一楼的同学Lucene4.* 以上的 已经改成了Numeric ...
Lucene日期排序及组合查询 -
ywjk520:
RangeQuery在哪个包里?
Lucene日期排序及组合查询 -
willwen:
有个疑问,楼主,为何初始化bits 从txt读取已有的网址是直 ...
布隆过滤器(Bloom Filter)之java实例 -
yu_226528:
还不如没有呢
jFreeChart 在jsp页上实现简单的折线图、柱状图
.package cc.vicp.eden.plug; . .import java.sql.*; .import java.util.*; .import java.lang.reflect.*; . ./** . * 连接池类。 . * . * @version 0.13 . * @author Eden . * . */ .public abstract class ConnectionPool { . /** . * 连接池。 . */ . private static final LinkedList<ConnectionHandler> pool; . . /** . * 最小连接数量,最大连接数量。 . */ . private static final int minConn, maxConn; . . /** . * 当前连接数量。 . */ . private static int curConn; . . /** . * 数据库的基本参数。 . */ . private static final String className, url, user, password; . /** . * 静态初始化。 . */ . static { . // 初始化池。 . pool = new LinkedList<ConnectionHandler>(); . // 初始化基本连接信息。 . minConn = 70; . maxConn = 100; . curConn = 0; . . className = "com.mysql.jdbc.Driver"; . url = "jdbc:mysql://localhost/jforum"; . user = "root"; . password = "n8NrCwfj"; . . // 加载数据库驱动。 . try { . Class.forName(className); . } catch (ClassNotFoundException e) { . e.printStackTrace(); . } . } . . /** . * 得到一个连接。 . * . * @return 连接(Connection)对象。 . * @throws SQLException . */ . public static Connection getConnection() throws SQLException { . // 当前已经使用的连接是否达到或超出最大连接数? . if (curConn >= maxConn) . // 抛出连接用尽异常。 . throw new ConnectExhaustException(); . Connection conn = null; . synchronized (pool) { . // 连接池内的连接是否有可用连接? . if (pool.size() > 0) { . ConnectionHandler handler = null; . // 得到一个连接管理者,并从连接池中移除。 . handler = pool.removeFirst(); . // 将该连接管理者设为可用。 . handler.enabled = true; . // 创建一个连接管理者(以代理方式创建)。 . conn = (Connection) Proxy.newProxyInstance(handler.conn . .getClass().getClassLoader(), handler.conn.getClass() . .getInterfaces(), handler); . } else { . // 创建一个链接。 . conn = DriverManager.getConnection(url, user, password); . // 创建一个连接管理者(以代理方式创建)。 . conn = (Connection) Proxy.newProxyInstance(conn.getClass() . .getClassLoader(), conn.getClass().getInterfaces(), . new ConnectionHandler(conn)); . } . // 当前已使用连接数增加1。 . curConn++; . System.out.println(Thread.currentThread().getName() . + " : getConnection" + "\ncurConn:" + curConn + "\npool:" . + pool.size() + "\n"); . } . // 以连接的方式返回连接管理者对象 . return conn; . . } . . /** . * 连接管理者类。 . * . * @author Eden . * . */ . private static class ConnectionHandler implements InvocationHandler { . /** . * 连接是否可用。 . */ . private boolean enabled; . . /** . * 连接(Connection)对象。 . */ . private Connection conn; . . /** . * 构造器。 . * . * @param conn . * 连接(Connection)对象。 . * . */ . public ConnectionHandler(Connection conn) { . this.conn = conn; . enabled = true; . } . . /** . * 代理方法,特别对于close方法进行了处理。 . */ . public Object invoke(Object proxy, Method method, Object[] args) . throws Throwable { . // 该连接管理者是否不可用? . if (!enabled) . // 抛出空指针异常 . throw new NullPointerException(); . // 是否调用了close方法? . if (method.getName() == "close") { . synchronized (pool) { . // 已使用连接数是否超出了最小连接数。 . if (curConn > minConn) { . // 关闭连接。 . conn.close(); . } else { . // 将连接管理者设为不可用。 . this.enabled = false; . // 将该连接返回连接池中。 . pool.add(this); . } . // 当前已使用连接数减少1。 . curConn--; . System.out.println(Thread.currentThread().getName() + " : " . + method.getName() + "\ncurConn:" + curConn . + "\npool:" + pool.size() + "\n"); . } . // 返回一个空值。 . return null; . } . . // 正常调用连接的各种方法。 . return method.invoke(conn, args); . } . . } . . /** . * 连接用尽异常类。 . * . * @author Eden . * . */ . private static final class ConnectExhaustException extends RuntimeException { . /** . * 版本序列号。 . */ . private static final long serialVersionUID = 0L; . } . . // ///////////////////////////////////////////////////////// . /* 其后部分为测试代码。 */ . private static final Object lock = new Object(); . . public static void main(String[] args) throws SQLException, . InterruptedException { . // 产生100个等待线程。 . for (int i = 0; i < 100; i++) { . new Monitor("Monitor - " + i); . } . // 提供产生100个等待线程的等待时间(1秒)。 . Thread.sleep(1000); . synchronized (cc.vicp.eden.plug.Monitor.lock) { . // 同时唤醒所有线程。 . cc.vicp.eden.plug.Monitor.lock.notifyAll(); . } . // 等待线程执行(5秒)。 . Thread.sleep(5000); . // 答应最终剩余连接数以及连接池中的可用连接数。 . System.out.println("\n\n\nfinal curConn : " + curConn + "\nfinal pool : " + pool.size()); . } .} . ./** . * 测试类。 . * . * @author Eden . * . */ .class Monitor extends Thread { . . public static final Object lock = new Object(); . . private Connection conn; . private static final Random random = new Random(); . . . public Monitor(String name) { . this.setName(name); . this.setPriority(Thread.MAX_PRIORITY); . this.start(); . } . . @Override . public void run() { . synchronized (lock) { . try { . System.out.println(this.getName() + " is ready!"); . lock.wait(); . } catch (InterruptedException e) { . e.printStackTrace(); . } . } . . try { . this.conn = ConnectionPool.getConnection(); . } catch (SQLException e) { . e.printStackTrace(); . } . . /*try { . Thread.sleep(Math.abs(random.nextInt() % 3) + 1); . } catch (InterruptedException e) { . e.printStackTrace(); . }*/ . . try { . conn.close(); . } catch (SQLException e) { . e.printStackTrace(); . } . } .}
发表评论
-
java用绑定变量调用Oracle
2011-03-11 16:59 1058在JAVA中的SQL 语句的编 ... -
java 实现压缩与解压缩ZIP
2010-08-18 10:17 813压缩的 import java.io.BufferedIn ... -
Java中对TreeMap中文排序
2010-08-17 18:20 1858package org.hsyd.test; ... -
java 卸载动态链接库
2010-06-21 11:53 1870import java.lang.reflect.Field; ... -
Java NIO原理和使用
2010-01-16 14:29 1573Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知 ... -
java排序全实现
2009-12-17 11:40 8581. package sort; 2. ... -
Java对各种文件的操作
2009-12-12 22:23 917java中提供了io类库,可以轻松的用java实现对文件的各种 ... -
直接由Java获取文件的创建时间
2009-11-11 11:22 2990import java.io.*; public cla ... -
非常实用的myeclipse快捷键
2009-08-13 22:24 1135技巧:取消自动validation validation有一堆 ... -
计算工作日和自然日
2009-06-24 19:21 3298用Java写一个倒计时程序,比如输入一个日期,格式为20090 ... -
文件排序后进行文本复制
2009-06-24 18:48 967现将TEXT1.TXT中的文本内容 复制到TEXT2.TXT中 ... -
getResourceAsStream的用法
2009-06-24 18:28 2570getResourceAsStream 用法大致有以下几种: ... -
将一首古诗竖着排序从右往左读
2009-06-24 17:36 3108import java.util.ArrayList; ... -
计算两个日期之间相差的天数
2009-06-24 16:47 1996程序经过一系列处理,得到两个string类型的时间值,一个值的 ... -
如何得到一年的所有星期二的日期?
2009-06-24 16:42 1415import java.text.DateFormat; ... -
根据格式日期转换
2009-06-24 16:39 883根据一个TimeZone的时间,比如一个“Africa/Acc ... -
当输入一个年月份的时候,输出这个月份的最后一天,比如输入: 2006年5月 就输出5月份的最后一个日
2009-06-24 16:00 1133import java.text.ParseException ... -
读取一个文本文档,例如有1~10行,要求按10~1行的顺序输出.并保存予原文件.
2009-06-24 15:49 1337import java.io.File; import ... -
编写一个辅助小学生学习乘法的程序
2009-06-22 16:39 1595编写一个辅助小学生学习乘法的程序。使用一个Random对象产生 ... -
输入一个字符串,按相反顺序输出该字符串。如输入1234,输出4321。
2009-06-22 16:18 4459package test25; import ...
相关推荐
JAVA数据库连接池 能够减少对内存的消耗 提高了性能
JAVA 完整的数据库连接池实现 可以配置根据自己需要
java数据库连接池代码,实例代码、注释
JAVA 使用数据库连接池连接Oracle数据库,全代码,附加详细说明
java 数据库连接池的实现代码 java 数据库连接池的实现代码 java 数据库连接池的实现代码
在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁
该文章把数据库连接池的内部原理写的非常透彻,注释也非常完整,是非常难得的一篇好文章,让开发人员可以更深层次的理解数据库连接池。该文件对可以设置连接池的初始大小、连接池自动增加的大小、 连接池最大的大小...
Java数据库连接池.
数据库连接池 数据库连接池 数据库连接池 数据库连接池
Java数据库连接池的使用示例,与大家共享下
数据库链接池,以及连接池的概念,自己做的笔记
java 数据库 连接池驱动.rar java 数据库 连接池驱动.rar java 数据库 连接池驱动.rar
无框架配置,纯java数据库连接池的配置。rar包中包含2个文件,一个是DBPool.java文件,一个是配置文件。
java数据库连接池connectionPool.zip java数据库连接池connectionPool.zip java数据库连接池connectionPool.zip java数据库连接池connectionPool.zip java数据库连接池connectionPool.zip
java数据库连接池的研究与实现源码java数据库连接池的研究与实现源码java数据库连接池的研究与实现源码java数据库连接池的研究与实现源码java数据库连接池的研究与实现源码java数据库连接池的研究与实现源码java...