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调用相应的方法
}
}
分享到:
相关推荐
用于分布式跟踪的库(如果在classpath中找到)可启用jdbc连接和查询跟踪(仅适用于p6spy或datasource-proxy) 为什么不将DataSource包装在配置中? 除了使用库之外,您还可以手动包装DataSource ,但是该库还提供了...
# mysql-proxy --proxy-lua-script=/usr/share/mysql-proxy/rw-splitting.lua ``` 5. 测试和监控: 现在,你可以通过应用程序连接到代理地址(192.168.1.147),并观察数据库操作是否按预期进行读写分离。为了...
Proxool,全称为Proxy Connection Pool,是一个灵活、轻量级的数据库连接池。它的优点在于可以动态监控连接池状态,如活动连接数、等待连接数等,并且可以根据实际需求动态调整池的大小。Proxool通过代理的方式管理...
props.setProperty("proxool.proxy-config.file", "proxy.xml"); DriverManager.registerDriver(new ProxoolDriver()); Connection conn = DriverManager.getConnection("proxool://", props); ``` 或者,如果使用...
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 ...
EXECUTE PHYSICAL_CONNECTION_POOL "SECURITYANDPROXY"."ConnectionPool" SELECT PROXY_TARGET_ID FROM OBEE12_PROXY_ACTAS WHERE PROXY_USER_ID = '@{USERID}' EXECUTE PHYSICAL_CONNECTION_POOL ...
<property name="hibernate.c3p0.proxy_factory_class">org.hibernate.connection.ProxoolProxyFactory <property name="proxool.hibernate.pool_name">my_pool <property name="proxool.hibernate.user">...
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是Proxy JDBC Pool的缩写,它通过创建数据库连接的代理来实现连接池。该框架的主要优点包括:轻量级、易于集成、支持多种数据库、提供监控和统计信息。在0.9.0RC3版本中,它继续强化了这些特性,为开发者提供...
public ConnectionHandler(ConnectionPool pool) { this.pool = pool; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("close".equals(method....
Response resp2 = Requests.get(url2).connectionPool(connectionPool).text(); connectionPool.close();如果使用了连接池,verify 和 proxy 需要在连接池中设置,Requests 中的设置无效。 标签:...
- proxy-config-name:唯一标识连接池的名称。 - driver-url:数据库 URL。 - driver-class:JDBC 驱动类。 - max-connections:最大连接数。 - active-timeout:连接未被使用的时间限制,超时后被移除。 - ...
3. **proxy-config-file**: 指定包含更多详细配置的XML文件路径,可以在这里定义更多的连接池属性。 4. **pool-name**: 给连接池分配一个唯一的名称,方便在日志和其他监控工具中识别。 5. **max-connections**: ...
- 实现数据库连接池(Connection Pool)以优化资源管理,如C3P0或HikariCP。 - 通过列名而非列索引获取ResultSet,以提高代码的可读性和健壮性。 - 关闭数据库资源(如Statement和Connection)时,使用try-with-...
C3P0(Concurrent DataSources Proxy Pool)是一个开源的JDBC连接池实现,旨在为JDBC提供额外的连接池功能,并且与大多数主流的JDBC驱动程序兼容。C3P0能够有效管理数据库连接资源,减少频繁创建和销毁连接所带来的...
- `urllib3.connectionpool` 模块:提供了连接池管理功能。 - `urllib3.exceptions` 模块:定义了一系列异常类型。 - `urllib3.fields` 模块:用于处理表单字段。 - `urllib3.filepost` 模块:用于处理文件上传。 - ...
- **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.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、用户名、...
<description>DB Connection Pool <res-ref-name>jdbc/myDB</res-ref-name> ... </resource-ref> ... ... </web-app> ``` 这种组合使用方式在大型网站和复杂应用环境中非常常见,能够充分利用两个服务器...
此外,还有一些核心类,如`ConnectionPool`、`ConnectionPoolDefinition`、`ConnectionPoolManager`、`HouseKeeper`、`Prototyper`、`ProtyperThread`、`ProxoolDriver`、`ProxyConnection`、`ProxyFactory`和`...