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、结果