`

2009-3-31 | ConnectionPool - Proxy

    博客分类:
  • JDBC
阅读更多

ConnectionPool.java

package ConnectionPool;

import java.util.*;
import java.sql.*;

public class ConnectionPool {

 private static ConnectionPool cPool = null;
 
 private static String url="jdbc:mysql://localhost/jdbc?user=root&password=xxxx";

 private static final int INIT_SIZE = 2;
 
 private static final int MAX_SIZE = 4;
 
 static int createdConnectionCount = 0;
 
 static LinkedList<Connection> pool = null;
 
 private ConnectionPool(){
  
 }
 
 static{
  cPool = new ConnectionPool();
  try {
   Class.forName("com.mysql.jdbc.Driver");
   pool = new LinkedList<Connection>();
   
   for(int i = 0 ;i<INIT_SIZE;i++){
    Connection conn = DriverManager.getConnection(url);
    MyConnection warpedConn = new MyConnection(cPool,conn);
    pool.addLast(warpedConn);

   }
  } catch (ClassNotFoundException e) {
   throw new ExceptionInInitializerError("mysql驱动没有找到");
  } catch(SQLException e){
   throw new ExceptionInInitializerError("sql error");
  }
  
  System.out.println("+++++++++++++++++++++++");
  for(int i=0;i<pool.size();i++){
   
   System.out.println(pool.get(i));
  }
  System.out.println("+++++++++++++++++++++++");
  
 }
 
 public static Connection getConnection() throws Exception {
  MyConnection conn = null;
  synchronized(cPool){
   if(pool.size()>0){
//    Connection realConn = pool.removeFirst();
//    conn = new MyConnection(cPool,realConn);
    conn = (MyConnection) pool.removeFirst();
    createdConnectionCount ++;
    
   } else if(pool.size()<=0 && createdConnectionCount < MAX_SIZE){
    try {
     Connection realConn = DriverManager.getConnection(url); 
     conn = new MyConnection(cPool,realConn);   //单例对象cPool

     createdConnectionCount ++;
    } catch (Exception e) {
     throw e;
    }
   } else{
    throw new Exception("数据库负荷超载");
   }
  }    
  return conn;
 }
 
 public static void free(Connection conn) throws SQLException{
  
  synchronized(cPool){
   if(conn != null &&
createdConnectionCount <MAX_SIZE){
    pool.addLast((Connection)conn);
    System.out.println("free from remove: --------" + conn + "---------");
    createdConnectionCount--;
   } else if(createdConnectionCount >INIT_SIZE){
    try {
     System.out.println("free from close: --------" + conn + "---------");
     ((MyConnection) conn).getRealConnection().close();
     createdConnectionCount--;
     
    } catch (SQLException e) {
     throw e;
    }
   }
  }
 }

}

//MyConnection.java  手动写的代理类

package ConnectionPool;

import java.sql.*;
import java.util.Map;
import java.util.Properties;

public class MyConnection implements Connection{
 
 
private Connection realConnection = null;
 private ConnectionPool pool = null;

 
 public MyConnection(ConnectionPool pool,Connection conn){
  this.realConnection = conn;
  this.pool = pool;
 }
 
 public void clearWarnings() throws SQLException {  //交给realConnection处理
  this.realConnection.clearWarnings();
 }

 public Connection getRealConnection(){      //交给realConnection处理
  return this.realConnection;
 }
 public void close() throws SQLException {  //本例真正感兴趣的方法
  //System.out.println("--------");
  
  pool.free(this);
  
 }

 ....

}

//MyConnectionUsePoolHandler.java  由Proxy产生的动态代理类

package ConnectionPool;

import java.lang.reflect.*;
import java.sql.*;


public class MyConnectionUsePoolHandler implements InvocationHandler{

 
 private Connection realConn =null;
 private Connection warpedConn = null;
 private ConnectionPool pool = null;
 
 public MyConnectionUsePoolHandler(ConnectionPool pool){
  this.pool = pool;
 }
 
 public Connection bind(Connection realConn){
  this.realConn = realConn;
  /**
   * loader --> 定义代理类的类加载器
   * 动态的构建一个代理类,这个代理类他实现了Connection接口  -->  new Class[]{Connection.class},
   * 并把这个接口所应实现的所有方法都交给一个InvocationHandler的invoke()
   * 处理(本例中为this)
   *
   * 使用方法
   * public Connection createConnection(){
   *   MyConnectionUsePoolHandler proxy = new MyConnectionUsePoolHandler(pool)
   *   return proxy.bing(realConn);
   * }

   *
   */
  warpedConn = (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, this);
  return warpedConn;

 }
 
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
 
  if("close".equals(method.getName())){  //如果是close方法,则执行括号内的代码
   pool.free(warpedConn);
  }  
  return method.invoke(this.realConn, args);  //如果是其它的方法,交给realConn,而realConn调用相应的方法

 }
}

分享到:
评论

相关推荐

    spring-boot-data-source-decorator:与p6spy,datasource-proxy,flexy-pool和spring-cloud-sleuth集成的Spring Boot

    用于分布式跟踪的库(如果在classpath中找到)可启用jdbc连接和查询跟踪(仅适用于p6spy或datasource-proxy) 为什么不将DataSource包装在配置中? 除了使用库之外,您还可以手动包装DataSource ,但是该库还提供了...

    Ubuntu10下如何搭建MySQL Proxy读写分离探讨

    # mysql-proxy --proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua ``` 5. 测试和监控: 现在,你可以通过应用程序连接到代理地址(192.168.1.147),并观察数据库操作是否按预期进行读写分离。为了...

    hibernate3+ proxool-0.9.1配置 和proxool-0.9.1.jar

    Proxool,全称为Proxy Connection Pool,是一个灵活、轻量级的数据库连接池。它的优点在于可以动态监控连接池状态,如活动连接数、等待连接数等,并且可以根据实际需求动态调整池的大小。Proxool通过代理的方式管理...

    proxool-0.8.3 jar包及应用实例

    props.setProperty("proxool.proxy-config.file", "proxy.xml"); DriverManager.registerDriver(new ProxoolDriver()); Connection conn = DriverManager.getConnection("proxool://", props); ``` 或者,如果使用...

    Proxool--java数据库连接池管理<内含jar包,源代码,文档>--下载不扣分,回帖加1分,欢迎下载,童叟无欺

    Proxool: Proxy JDBC Connection Poolby billhorsman A Java SQL Driver that provides a connection pool wrapper around another Driver of your choice. Very simple to migrate existing code. Fully ...

    biee12C充当功能配置文档

    EXECUTE PHYSICAL_CONNECTION_POOL "SECURITYANDPROXY"."ConnectionPool" SELECT PROXY_TARGET_ID FROM OBEE12_PROXY_ACTAS WHERE PROXY_USER_ID = '@{USERID}' EXECUTE PHYSICAL_CONNECTION_POOL ...

    Hibernate2和Hibernate3连接池配置.doc

    &lt;property name="hibernate.c3p0.proxy_factory_class"&gt;org.hibernate.connection.ProxoolProxyFactory &lt;property name="proxool.hibernate.pool_name"&gt;my_pool &lt;property name="proxool.hibernate.user"&gt;...

    linux+nginx+tomcat+redis安装配置手册.docx

    compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.2' // compile group: 'commons-codec', name: 'commons-codec', version: '1.9' testCompile group: 'junit', name: 'junit', ...

    proxool 0.9.0RC3连接池配置的案例

    Proxool是Proxy JDBC Pool的缩写,它通过创建数据库连接的代理来实现连接池。该框架的主要优点包括:轻量级、易于集成、支持多种数据库、提供监控和统计信息。在0.9.0RC3版本中,它继续强化了这些特性,为开发者提供...

    java动态代理实现数据库连接池

    public ConnectionHandler(ConnectionPool pool) { this.pool = pool; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("close".equals(method....

    HTTP请求库java-requests.zip

    Response resp2 = Requests.get(url2).connectionPool(connectionPool).text(); connectionPool.close();如果使用了连接池,verify 和 proxy 需要在连接池中设置,Requests 中的设置无效。 标签:...

    三大连接池参数说明(DBCP\C3P0\Proxool)

    - proxy-config-name:唯一标识连接池的名称。 - driver-url:数据库 URL。 - driver-class:JDBC 驱动类。 - max-connections:最大连接数。 - active-timeout:连接未被使用的时间限制,超时后被移除。 - ...

    proxool配置参数说明及proxool-0.9.1相关jar包及spring配置方法

    3. **proxy-config-file**: 指定包含更多详细配置的XML文件路径,可以在这里定义更多的连接池属性。 4. **pool-name**: 给连接池分配一个唯一的名称,方便在日志和其他监控工具中识别。 5. **max-connections**: ...

    Java 55道面试题和答案.docx

    - 实现数据库连接池(Connection Pool)以优化资源管理,如C3P0或HikariCP。 - 通过列名而非列索引获取ResultSet,以提高代码的可读性和健壮性。 - 关闭数据库资源(如Statement和Connection)时,使用try-with-...

    C3P0 在tomcat中如何配置

    C3P0(Concurrent DataSources Proxy Pool)是一个开源的JDBC连接池实现,旨在为JDBC提供额外的连接池功能,并且与大多数主流的JDBC驱动程序兼容。C3P0能够有效管理数据库连接资源,减少频繁创建和销毁连接所带来的...

    python自带的url处理库 文档

    - `urllib3.connectionpool` 模块:提供了连接池管理功能。 - `urllib3.exceptions` 模块:定义了一系列异常类型。 - `urllib3.fields` 模块:用于处理表单字段。 - `urllib3.filepost` 模块:用于处理文件上传。 - ...

    常见IIS错误,适合web编程者

    - **403.18 Application Pool Identity Mismatch**:应用池身份不匹配,IIS 6.0特有。 - **403.19 CGI Application Mismatch**:CGI应用程序不匹配,IIS 6.0特有。 - **403.20 Passport Login Failed**:Passport...

    proxool-0.9.1 Hibernate 的常用链接池技术 附带配置 一学就会

    proxool.my_pool_name.create-proxy-if-needed=true proxool.my_pool_name.house-keeping-sleep-time=30000 proxool.my_pool_name.soft-minimum-connections=10 ``` 在这个例子中,我们配置了数据库URL、用户名、...

    resin+nginx+使用说明文档

    &lt;description&gt;DB Connection Pool &lt;res-ref-name&gt;jdbc/myDB&lt;/res-ref-name&gt; ... &lt;/resource-ref&gt; ... ... &lt;/web-app&gt; ``` 这种组合使用方式在大型网站和复杂应用环境中非常常见,能够充分利用两个服务器...

    proxool连接池使用说明

    此外,还有一些核心类,如`ConnectionPool`、`ConnectionPoolDefinition`、`ConnectionPoolManager`、`HouseKeeper`、`Prototyper`、`ProtyperThread`、`ProxoolDriver`、`ProxyConnection`、`ProxyFactory`和`...

Global site tag (gtag.js) - Google Analytics