本连接池使用了代理模式,消除了油漆工那种繁琐的编码方式,本来嘛,只是修改一个close方法何必去实现整个Connection类。其中main函数中的Connection c11 = ConnectionPool.getConnection();将会报错(应为连接数超过了最大连接数),去掉改行本连接池将能正常运行了,由于注释比较详细,在这里就不多废话了,请个位看如下代码。
java 代码
- package cc.vicp.eden.plug;
-
- import java.sql.*;
- import java.util.*;
- import java.lang.reflect.*;
-
-
-
-
-
-
-
-
- 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 = 3;
- maxConn = 10;
- 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();
- }
- }
-
-
-
-
-
-
-
- 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));
- }
-
- curConn++;
- }
-
- return conn;
- }
-
-
-
-
-
-
-
- private static class ConnectionHandler implements InvocationHandler {
-
-
-
- private boolean enabled;
-
-
-
-
- private Connection conn;
-
-
-
-
-
-
-
-
- public ConnectionHandler(Connection conn) {
- this.conn = conn;
- enabled = true;
- }
-
-
-
-
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
-
- if (!enabled)
-
- throw new NullPointerException();
- synchronized (pool) {
-
- if (method.getName() == "close") {
-
- if (curConn > minConn) {
-
- conn.close();
- } else {
-
- this.enabled = false;
-
- pool.add(this);
- }
-
- curConn--;
- System.out.println(Thread.currentThread().getName() + " : " + method.getName() + "\ncurConn:" + curConn + "\npool:" + pool.size() + "\n");
-
- return null;
- }
- }
-
- return method.invoke(conn, args);
- }
-
- }
-
-
-
-
-
-
-
- private static final class ConnectExhaustException extends RuntimeException {
-
-
-
- private static final long serialVersionUID = 0L;
- }
-
- public static void main(String[] args) throws SQLException,
- InterruptedException {
- for (int i = 0; i < 50; i++) {
- Connection conn = null;
- try {
- conn = getConnection();
- } catch (ConnectExhaustException e) {
- Thread.sleep(1000);
- i--;
- continue;
- }
- new Monitor(conn, "Monitor - " + i);
- }
- }
- }
-
- class Monitor extends Thread {
-
- private Connection conn;
-
- public Monitor(Connection conn, String name) {
- this.conn = conn;
- this.setName(name);
- this.start();
- }
-
- public void run() {
- try {
- Thread.sleep(10000);
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
分享到:
相关推荐
数据库连接池ConnectionPool的实现和配置 数据库连接池(Database Connection Pool)是一种提高数据库访问效率的技术,通过重用已经创建的数据库连接来减少创建新连接的开销。下面是一个使用Java语言实现的数据库...
这里我们将深入探讨`ConnectionPool`相关的知识,包括其工作原理、主要功能以及如何通过提供的`ConnectionPool.java`和`PoolManager.java`文件来实现一个简单的连接池。 1. 数据库连接池的工作原理: - 初始化阶段...
- `ConnectionPool`: 实现连接池的核心类,包含连接的创建、获取、释放和管理逻辑。 - `DatabaseConnection`: 表示单个数据库连接的类,可能包含与特定数据库交互的方法。 - `PoolConfig`: 存储连接池配置信息的类,...
在这个关于`ConnectionPool`实现的讨论中,我们可以看到多种设计模式的应用,包括工厂模式、装饰模式、适配器模式和组合模式。 首先,`ResourceMan`是一个抽象的pooling逻辑实现,它关注于资源的管理和复用,而不...
### JDBC Connection Pool 实现 #### 一、简介 在Java应用程序中,数据库连接是非常宝贵的资源。为了提高性能和效率,通常会使用连接池技术来管理这些数据库连接。连接池可以复用现有的数据库连接,避免频繁地创建...
Apache的DBCP(Database Connection Pool)是一个开源的数据库连接池实现,它是Commons DBCP项目的一部分。DBCP提供了数据源接口,使得应用可以通过这个接口获取和释放连接,而实际的连接创建和管理则由连接池来处理...
本文将深入解析“ConnectionPool”(数据库连接池)的工作原理,常见实现及使用方法。 **一、数据库连接池的概念** 数据库连接池,简单来说,就是管理数据库连接的池化技术。它预先创建一定数量的数据库连接,当多...
当你下载这个名为"connection_pool"的压缩包后,解压它,你会看到包含的jar文件,这些文件就是连接池库的实现。将它们导入到你的项目中(例如通过Maven或Gradle的依赖管理),就可以在代码中调用连接池服务,初始化...
`connectionPool.jar`是一个实现了这一功能的库,它将JDBC(Java Database Connectivity)接口封装起来,提供了更简便的配置和使用方式。 **连接池的工作原理:** 1. **初始化**:在应用启动时,连接池会预先创建...
Java_C3P0_ConnectionPool.rar 文件包含的是关于Java中C3P0数据库连接池的实现和使用知识。C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,尤其是在...
【标题】:“ConnectionPool---Web容器” 在Web开发中,数据库连接池(Connection Pool)扮演着至关重要的角色。它是一种数据库资源管理技术,主要用于优化数据库的连接创建、分配和回收,以提高系统的性能和响应...
DBCP(Database Connection Pool)是一个开源的数据库连接池实现,它依赖于Apache Jakarta commons-pool对象池机制。DBCP允许应用程序直接使用数据库连接池的功能,并且Tomcat的数据源也采用了DBCP作为其底层技术。 ...
本项目“Linux-MySQL-ConnectionPool-C.zip”聚焦于使用C语言在Linux操作系统上实现MySQL数据库的连接池技术。下面我们将深入探讨这一主题。 首先,我们需要理解什么是连接池。连接池是数据库管理中的一个概念,它...
数据库连接池(Database Connection Pool,简称DCP)被广泛应用于解决传统数据库访问方法中的问题。本文首先介绍了DCP的基本模型及其工作原理,并在此基础上提出了一种动态优化方法。通过分析动态DCP的工作机制,...
Oracle Universal Connection Pool(UCP)是一种高效、可配置的连接管理解决方案,它允许应用程序在数据库连接的创建、管理和释放上实现优化,以提高系统性能并减少资源消耗。 在本指南中,开发者将学习如何使用UCP...
在实现过程中,我们可以使用Java的`java.sql.Connection`接口和`java.sql.DriverManager`类来管理和创建数据库连接。此外,为了简化管理,还可以使用第三方的连接池库,如Apache的DBCP、C3P0或HikariCP等,它们提供...
J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池,不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时,我们可用的JDBC 数据库连接池并不多,并且一般性能都不好。...