- 浏览: 347802 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1083在JAVA中的SQL 语句的编 ... -
java 实现压缩与解压缩ZIP
2010-08-18 10:17 850压缩的 import java.io.BufferedIn ... -
Java中对TreeMap中文排序
2010-08-17 18:20 1888package org.hsyd.test; ... -
java 卸载动态链接库
2010-06-21 11:53 1914import java.lang.reflect.Field; ... -
Java NIO原理和使用
2010-01-16 14:29 1646Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知 ... -
java排序全实现
2009-12-17 11:40 9281. package sort; 2. ... -
Java对各种文件的操作
2009-12-12 22:23 988java中提供了io类库,可以轻松的用java实现对文件的各种 ... -
直接由Java获取文件的创建时间
2009-11-11 11:22 3027import java.io.*; public cla ... -
非常实用的myeclipse快捷键
2009-08-13 22:24 1204技巧:取消自动validation validation有一堆 ... -
计算工作日和自然日
2009-06-24 19:21 3332用Java写一个倒计时程序,比如输入一个日期,格式为20090 ... -
文件排序后进行文本复制
2009-06-24 18:48 989现将TEXT1.TXT中的文本内容 复制到TEXT2.TXT中 ... -
getResourceAsStream的用法
2009-06-24 18:28 2592getResourceAsStream 用法大致有以下几种: ... -
将一首古诗竖着排序从右往左读
2009-06-24 17:36 3138import java.util.ArrayList; ... -
计算两个日期之间相差的天数
2009-06-24 16:47 2020程序经过一系列处理,得到两个string类型的时间值,一个值的 ... -
如何得到一年的所有星期二的日期?
2009-06-24 16:42 1444import java.text.DateFormat; ... -
根据格式日期转换
2009-06-24 16:39 909根据一个TimeZone的时间,比如一个“Africa/Acc ... -
当输入一个年月份的时候,输出这个月份的最后一天,比如输入: 2006年5月 就输出5月份的最后一个日
2009-06-24 16:00 1165import java.text.ParseException ... -
读取一个文本文档,例如有1~10行,要求按10~1行的顺序输出.并保存予原文件.
2009-06-24 15:49 1352import java.io.File; import ... -
编写一个辅助小学生学习乘法的程序
2009-06-22 16:39 1624编写一个辅助小学生学习乘法的程序。使用一个Random对象产生 ... -
输入一个字符串,按相反顺序输出该字符串。如输入1234,输出4321。
2009-06-22 16:18 4514package test25; import ...
相关推荐
常见的Java数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等,它们提供了更完善的连接管理功能和性能优化策略。 总结一下,Java数据库连接池的基本概念和上述代码中的实现包括以下几点: 1. 数据库连接信息...
本项目提供了一个轻量级的Java数据库连接池实现,旨在简化开发过程,提高应用性能并降低资源消耗。下面将详细介绍这个轻量级Java数据库连接池的设计理念、工作原理以及如何使用。 1. **设计理念** 轻量级数据库...
总结,Java 完整的数据库连接池实现涉及到选择合适的连接池实现、配置参数、初始化连接池以及在代码中正确地获取和释放连接。理解这些概念和步骤对于优化 Java 应用程序的数据库性能至关重要。通过合理配置和使用...
2. **常见的Java数据库连接池实现** - C3P0:一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。 - DBCP (Apache BasicDataSource):Apache的一个开源项目,基于Jakarta Pool实现...
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
Java数据库连接池是Java开发中一个非常重要的技术,它主要用于管理数据库连接,提高数据库操作的效率和性能。在Java应用程序中,频繁地创建和关闭数据库连接会导致大量的系统资源浪费,而连接池则可以复用已建立的...
本篇文章将深入解析一个自定义的JAVA数据库连接池类,帮助开发者更好地理解和运用这一关键技术。 首先,连接池的基本思想是预先创建一定数量的数据库连接,并存储在一个集合(如Vector)中,供应用程序按需获取和...
### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...
总的来说,Java数据库连接池如C3P0和Druid,以及Spring的JdbcTemplate,都是为了优化数据库操作而设计的工具。它们各自有其特点和优势,开发者可以根据项目需求选择合适的技术。在使用过程中,充分理解和合理配置...
Java数据库连接池的原理与应用 在Java开发领域,数据库连接池(Database Connection Pool,简称DBCP)是一种提高数据库访问性能、降低资源消耗的重要技术。它通过预先建立一定数量的数据库连接,存储在一个“池”中...
Java数据库连接池是Java应用程序管理数据库连接的一种高效方式。它避免了每次需要访问数据库时创建新的连接,而是预先创建一定数量的连接并保存在池中,当程序需要时可以从池中获取,用完后归还,从而提高了系统性能...