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

1、DBConnection.java

package com.db1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
	private static String drivers = DBConfig.DRIVERS;
	private static String url = DBConfig.URL;
	private static String user = DBConfig.USER;
	private static String password = DBConfig.PASSWORD;
	
	public static Connection GetConnection() { // 获取数据连接
		Connection conn = null;
		try {
			Class.forName(drivers).newInstance(); 
			//
		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		 
		 try {
			 System.out.println("url------"+url);
			 System.out.println("user------"+user);
			 System.out.println("password------"+password);
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		return conn;
		}
	public static void close(Connection conn)
	{
		try {
			if(conn != null && !conn.isClosed())
			{
				conn.close();
			}
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}
/*
 * 关闭连接
 */
		

2、Utils.java

package com.my.datasource;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Utils {
	private static String drivers = DBConfig.DRIVERS;
	private static String url = DBConfig.URL;
	private static String user = DBConfig.USER;
	private static String password = DBConfig.PASSWORD;
	public static Connection GetConnection() { // 获取数据连接
		Connection conn = null;
		try {
			Class.forName(drivers).newInstance(); 
			//
		} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		 
		 try {
			 System.out.println("url------"+url);
			 System.out.println("user------"+user);
			 System.out.println("password------"+password);
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		return conn;
		}
	public static void close(Connection conn)
	{
		try {
			if(conn != null && !conn.isClosed())
			{
				conn.close();
			}
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}

3、DBConfig.java

package com.db1;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class DBConfig {
	private static String db_config = "F:\\EclipseSpace\\EclipseSpace\\DBTest00\\src\\com\\db1\\dbconfig.properties";
	public static String DRIVERS = null;
	public static String URL = null;
	public static String USER = null;
	public static String PASSWORD = null;
	static  //声明静态代码块
	{
		Properties props = new Properties();
		InputStream ips = null;
		try {
			//读取属性文件
			ips = new FileInputStream(db_config);
			props.load(ips);
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		DRIVERS = props.getProperty("drivers");
		URL = props.getProperty("url");
		USER = props.getProperty("user");
		PASSWORD = props.getProperty("pwd");
	}

}

4、MyDataSource.java

package com.my.datasource;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 自定义连接池
 * @author Administrator
 *
 */
public class MyDataSource {
	//定义一个池,用于存放连接
	private static List<Connection> pool = Collections.synchronizedList(new ArrayList<>());
	//使用静态代码块给池中加入连接
	static {
		for(int i = 0; i < 10; i++) {
			Connection conn = Utils.GetConnection();
			pool.add(conn);
		}
	}
	/**
	 * 获取一个连接
	 * @return
	 */
	public static Connection removeConnection() {
		Connection conn =  pool.remove(0);
		//创建代理对象
		Connection proxyConn = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(),
				conn.getClass().getInterfaces(),
				new InvocationHandler() {

					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						// TODO 自动生成的方法存根
						Object rtValue = null;
						if("close".equals(method.getName())) {
							//还回池中
							pool.add(conn);
						}
						else {
							rtValue = method.invoke(conn, args);
						}
						return rtValue;
					}
			
		});
		return proxyConn;
	}
	// 获取池中的连接数
	public static int getPoolSize() {
		return pool.size();
	}
}

5、 Test.java

package com.my.datasource;

import java.sql.Connection;
import java.sql.SQLException;

public class Test {

	public static void main(String[] args) throws SQLException {
		// TODO 自动生成的方法存根
		int size = MyDataSource.getPoolSize();
		System.out.println("使用连接之前" + size);
		for(int i = 0; i < 10; i ++) {
		Connection conn = MyDataSource.removeConnection();
		System.out.println(conn);
		try {
			//不应该关闭,应放入池中。
			conn.close();
		} catch (SQLException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		}
		
		int size1 = MyDataSource.getPoolSize();
		System.out.println("使用连接之后" + size1);
	}

}

 6、结果

猜你喜欢

转载自blog.csdn.net/hyf_home/article/details/81698536