`

利用proxy模式 来生成 DataSource

阅读更多
思想 就是 代理 DataSource对象 代理 getConnection方法
在代理connection对象 代理 close方法
/**
*
*/
package com.mjp.core.db.jdbc.ds;

import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;

import javax.sql.DataSource;

import com.mjp.core.db.tool.DbUtils;
import com.mjp.core.properties.PropertiesFacade;


/**
* @author Administrator
*
*/
public class DbcpDataSource implements DataSource {

private static Vector<Connection> connPool;
private static int poolMaxSize = 10;
private static int poolMinSize = 1;
private String userName;
private String password;
private String driverClass;
private String url;

public DbcpDataSource() {
init();
}

/**
*
*/
private void init() {
this.url = PropertiesFacade.getProperties("database.url");
this.driverClass = PropertiesFacade.getProperties("database.driver");
this.userName = PropertiesFacade.getProperties("database.user");
this.password = PropertiesFacade.getProperties("database.password");
try {
poolMaxSize = Integer.parseInt(PropertiesFacade
.getProperties("database.maxsize"));
} catch (Exception ex) {
poolMaxSize = 10;
}
try {
poolMinSize = Integer.parseInt(PropertiesFacade
.getProperties("database.minsize"));
} catch (Exception ex) {
poolMinSize = 1;
}
System.out.println("url:" + this.url);
System.out.println("driverClass:" + this.driverClass);
System.out.println("userName:" + this.userName);
System.out.println("password:" + this.password);
connPool = new Vector<Connection>();
for (int i = 0; i < poolMaxSize; i++) {
connPool.add(createConnection());
}
}

/**
* @return
*/
private Connection createConnection() {
Connection connection = null;
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
connection = DriverManager.getConnection(url, userName, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}

private Connection createProxyConnection(Connection connection){
if(connection == null){
connection = createConnection();
}
ProxyConnectionHandler proxyHandler = new ProxyConnectionHandler();
proxyHandler.setConnection(connection);
return proxyHandler.proxyBind();
}

/*
* (non-Javadoc)
*
* @see javax.sql.DataSource#getConnection()
*/
public Connection getConnection() {

int size = connPool.size();
if (connPool.size() < poolMinSize) {
return createProxyConnection(null);
} else {
Connection connection = (Connection) connPool.get(size - 1);
connPool.remove(size - 1);
return createProxyConnection(connection);
}
}

public static synchronized void releaseConnection(Connection connection) {
if(connPool.size() > poolMaxSize){
DbUtils.closeQuietly(connection);
}else{
connPool.add(connection);
}
}

/*
* (non-Javadoc)
*
* @see javax.sql.DataSource#getConnection(java.lang.String,
* java.lang.String)
*/
public Connection getConnection(String arg0, String arg1)
throws SQLException {
return null;
}

/*
* (non-Javadoc)
*
* @see javax.sql.DataSource#getLogWriter()
*/
public PrintWriter getLogWriter() throws SQLException {
return null;
}

/*
* (non-Javadoc)
*
* @see javax.sql.DataSource#getLoginTimeout()
*/
public int getLoginTimeout() throws SQLException {
return 0;
}

/*
* (non-Javadoc)
*
* @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter)
*/
public void setLogWriter(PrintWriter arg0) throws SQLException {

}

/*
* (non-Javadoc)
*
* @see javax.sql.DataSource#setLoginTimeout(int)
*/
public void setLoginTimeout(int arg0) throws SQLException {

}

}
=========================
package com.mjp.core.db.jdbc.ds;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;

import com.mjp.core.util.ProxyUtils;


public class ProxyConnectionHandler implements InvocationHandler {

private Connection connection;

public ProxyConnectionHandler(){}

public ProxyConnectionHandler(Connection connection) {
this.connection = connection;
}

/* (non-Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (method.getName().equals("close")) {
if(connection.getAutoCommit() == false){
try{
connection.commit();
}catch(Exception ex){
connection.rollback();
ex.printStackTrace();
}finally{
try{
connection.setAutoCommit(true);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
DbcpDataSource.releaseConnection(connection);
return null;
} else {
return method.invoke(connection, args);
}
}

public Connection proxyBind() {
Connection proxyConnection = (Connection) Proxy.newProxyInstance(
connection.getClass().getClassLoader(), ProxyUtils.getAllIntefaces(connection.getClass())
, this);
return proxyConnection;
}

public Connection getConnection() {
return connection;
}


public void setConnection(Connection connection) {
this.connection = connection;
}
}
分享到:
评论

相关推荐

    Proxy 模式学习代码

    Proxy模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到...通过分析和运行这些示例,你可以更深入地掌握如何在Java中使用Proxy模式来增强对象的功能或控制其访问。

    简单工厂模式,工厂方法模式,抽象工厂模式和Proxy模式

    到工厂方法到抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解和比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下Proxy模式。

    设计模式C++学习之代理模式(Proxy)

    代理模式的核心思想是通过代理类来代替实际的对象,使得客户端可以通过代理类与真实对象进行交互,而无需直接操作真实对象,这样可以增加程序的灵活性,同时也便于管理或扩展系统。 代理模式主要分为以下几种类型:...

    Proxy模式

    静态代理是通过显式创建一个代理类来实现的,而动态代理则利用Java的反射API和InvocationHandler接口在运行时动态生成代理类。 源码分析是理解设计模式的关键。对于Proxy模式,我们可以分析一个简单的静态代理例子...

    设计模式之代理模式proxy.zip

    JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当我们调用代理对象的方法时,实际执行的是InvocationHandler的invoke方法,这样可以...

    C++ Proxy模式

    Proxy模式是软件设计模式中的一个关键元素,属于结构型模式的一种。在C++中,Proxy模式主要用于为其他对象提供一种代理以控制对这个对象的访问。这种模式的核心思想是通过创建一个代理对象来充当目标对象的中介,...

    从房屋买卖看 java proxy 模式

    标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...

    datasource-proxy:为JDBC交互和通过代理执行查询提供侦听器框架

    数据源代理 关于 为JDBC API提供代理类,以拦截正在执行的查询和方法。 版本号 2.x (开发中) ... &lt; artifactId&gt;datasource-proxy [LATEST_VERSION] 最新版本是: 不依赖其他库,一切都是可选的。

    Proxy代理模式经典实例(绝对OOP)

    总的来说,Proxy代理模式为我们提供了一种灵活的方式来扩展或控制对象的行为,而无需修改对象本身。它在许多场景下都非常有用,如远程调用、安全控制、缓存策略以及事务管理等。通过理解和熟练使用Proxy代理模式,...

    ABAP 调用ABAP PROXY

    2. **生成Proxy代码**:在目标系统中,使用SE80事务码,通过“生成ABAP Proxy”功能,输入源系统的服务接口信息,自动生成对应的ABAP Proxy类和相关代码。 3. **编译与激活**:生成的Proxy代码需要在目标系统中进行...

    利用wsdl.exe生成webservice代理类

    利用wsdl.exe生成webservice代理类: 根据提供的wsdl生成webservice代理类 1、开始-&gt;程序-&gt;Visual Studio 2005 命令提示 2、输入如下红色标记部分 D:\Program Files\Microsoft Visual Studio 8\VC&gt;wsdl /...

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

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

    设计模式之代理模式proxy

    代理模式可以通过继承、接口或动态代理(如Java的`java.lang.reflect.Proxy`类)来实现。具体选择哪种方式取决于实际需求和语言特性。 总的来说,代理模式是一种灵活的设计模式,它可以让我们在不修改原有对象的...

    C#面向对象设计模式纵横谈(13):Proxy 代理模式(结构型模式) (Level 300)

    - C#的System.Reflection.Emit命名空间提供了动态类型生成的能力,允许在运行时创建代理类,这在AOP(面向切面编程)中非常有用。 - System.Proxy中的DynamicMethod和Delegate类也可以帮助构建动态代理,用于实现...

    基于Proxy模式的分布式MySQL数据库中间件设计源码

    MySQL数据库中间件:基于C语言开发,包含59个文件,包括22个C源文件...该项目是一个分布式MySQL数据库中间件,采用Proxy模式设计,基于核心业务对象切分,旨在提供高效的数据库查询和处理能力,适用于分布式系统环境。

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    它通过设置`esri.config.defaults.io.proxyUrl`来指定代理服务的URL,当ArcGIS JavaScript API请求需要跨域访问的资源时,会自动通过这个代理转发请求。在Java应用中,你需要将`proxy.jsp`部署到服务器,并在Esri的...

    详解设计模式中的proxy代理模式及在Java程序中的实现

    在Java中,我们可以利用反射API和Java的Proxy类来动态地创建代理对象。Proxy类提供了`newProxyInstance()`方法,用于创建代理对象。这个方法需要三个参数:一个类加载器,一个接口数组(代理对象需要实现的接口),...

    Proxy 代理模式

    总结来说,Proxy代理模式在Java中提供了扩展和控制对象访问的手段。无论是静态代理还是动态代理,都可以帮助我们在不修改原有代码的情况下,增强或扩展对象的功能,从而提高代码的灵活性和可维护性。在实际开发中,...

    PureJS (6.4):利用 proxy 对象实现权限控制和数据校验

    在本文中,我们将深入探讨如何利用Proxy对象实现权限控制和数据校验,这在构建复杂的前端应用或者提供更加安全的数据管理时尤其有用。 首先,Proxy对象是ES6引入的一个新特性,它通过创建一个代理实例来充当目标...

    proxy.rar java三种代理模式源码

    在"InterfaceProxy"目录中,你可以看到如何利用`Proxy.newProxyInstance()`方法创建接口的代理对象,并通过实现`InvocationHandler`接口的`invoke()`方法来控制代理对象的行为。这种方式比静态代理更灵活,因为不...

Global site tag (gtag.js) - Google Analytics