数据源,动态代理

package com.huowolf.jdbc.pool;

import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.Properties;
import java.util.logging.Logger;

import javax.sql.DataSource;

//一个标准的数据源
public class MyDataSource1 implements DataSource {
	private static String driverClassName;
	private static String url;
	private static String user;
	private static String password;
	private static LinkedList<Connection> pool = new LinkedList<Connection>();//存储连接的池
	static{
		try {
			InputStream in = com.huowolf.JdbcUtil.JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
			Properties props = new Properties();
			props.load(in);
			driverClassName = props.getProperty("driverClassName");
			url = props.getProperty("url");
			user = props.getProperty("user");
			password = props.getProperty("password");
			Class.forName(driverClassName);
			
			//初始化10个连接到池中
			for(int i=0;i<10;i++){
				Connection conn = DriverManager.getConnection(url, user, password);
				pool.add(conn);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//从池中获取一个连接
	@Override
	public synchronized Connection getConnection() throws SQLException {
		if(pool.size()>0){
			final Connection conn = pool.remove();//原有对象
			//返回动态代理对象
			return (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() {
				@Override
				public Object invoke(Object proxy, Method method, Object[] args)
						throws Throwable {
					if("close".equals(method.getName())){
						return pool.add(conn);
					}else{
						return method.invoke(conn, args);
					}
				}
			});
		}else{
			throw new RuntimeException("对比起!服务器真忙");
		}
	}

	
	
	@Override
	public Connection getConnection(String username, String password)
			throws SQLException {
		return null;
	}

	@Override
	public PrintWriter getLogWriter() throws SQLException {
		return null;
	}

	@Override
	public int getLoginTimeout() throws SQLException {
		return 0;
	}

	@Override
	public void setLogWriter(PrintWriter out) throws SQLException {

	}

	@Override
	public void setLoginTimeout(int seconds) throws SQLException {

	}

	@Override
	public boolean isWrapperFor(Class<?> iface) throws SQLException {
		return false;
	}

	@Override
	public <T> T unwrap(Class<T> iface) throws SQLException {
		return null;
	}

	@Override
	public Logger getParentLogger() throws SQLFeatureNotSupportedException {
		return null;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态代理可以在运行时生成代理对象,从而可以在代理对象中添加额外的逻辑,比如实现数据源的切换。下面是一个使用动态代理实现数据源切换的示例代码: 首先定义两个数据源: ```java public class DataSource1 { public void execute() { System.out.println("Execute query in Data Source 1"); } } public class DataSource2 { public void execute() { System.out.println("Execute query in Data Source 2"); } } ``` 然后定义一个接口,用于代理数据源: ```java public interface DataSource { void execute(); } ``` 接下来实现一个动态代理类,用于在运行时生成代理对象: ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DataSourceProxy implements InvocationHandler { private Object target; public DataSourceProxy(Object target) { this.target = target; } public static DataSource createProxy(DataSource dataSource1, DataSource dataSource2) { return (DataSource) Proxy.newProxyInstance( DataSourceProxy.class.getClassLoader(), new Class[]{DataSource.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("execute")) { if (ThreadLocalUtil.getDataSource() == 1) { dataSource1.execute(); } else { dataSource2.execute(); } return null; } return method.invoke(proxy, args); } }); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("execute")) { if (ThreadLocalUtil.getDataSource() == 1) { method.invoke(target, args); } else { System.out.println("Switch to Data Source 2"); ThreadLocalUtil.setDataSource(2); method.invoke(target, args); } return null; } return method.invoke(target, args); } } ``` 在该代理类中,我们重写了 `invoke` 方法,当调用代理对象的 `execute` 方法时,根据当前的数据源决定执行哪个数据源的 `execute` 方法。在实现过程中,我们使用了一个 `ThreadLocal` 变量来存储当前使用的数据源编号,从而可以在不同的线程中使用不同的数据源。 最后,我们可以使用下面的代码来测试该代理类: ```java public class Application { public static void main(String[] args) { DataSource dataSource1 = new DataSource1(); DataSource dataSource2 = new DataSource2(); DataSource dataSource = DataSourceProxy.createProxy(dataSource1, dataSource2); ThreadLocalUtil.setDataSource(1); dataSource.execute(); ThreadLocalUtil.setDataSource(2); dataSource.execute(); } } ``` 在该测试代码中,我们首先使用数据源 1 执行一次查询,然后切换到数据源 2 执行一次查询。在每次查询之前,我们使用 `ThreadLocalUtil.setDataSource` 方法设置当前的数据源编号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值