连接池技术

我们知道,使用jdbc操作数据库的效率最高

同样条件下,jdbc>mybatis>hibernate,

而在连接中,获取connection是最耗费资源的,要解决这个问题,可以使用享元模式解决,

下面写一个程序模拟下连接池

public class MyDataSource implements DataSource {

	// 链表 --- 实现 栈结构
	private LinkedList<Connection> dataSources = new LinkedList<Connection>();

	public MyDataSource() {
		// 一次性创建10个连接
		for (int i = 0; i < 10; i++) {
			try {
				Connection conn = JDBCUtils.getConnection();
				// 将连接加入连接池中
				dataSources.add(conn);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public Connection getConnection() throws SQLException {
		// 取出连接池中一个连接
		final Connection conn = dataSources.removeFirst(); // 删除第一个连接返回
		System.out.println("取出一个连接剩余 " + dataSources.size() + "个连接!");
		// 将目标Connection对象进行增强 调用close方法不会真的关闭连接,会吧链接放回容器中
		Connection connProxy = (Connection) Proxy.newProxyInstance(conn
				.getClass().getClassLoader(), conn.getClass().getInterfaces(),
				new InvocationHandler() {
					// 执行代理对象任何方法 都将执行 invoke
					@Override
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						if (method.getName().equals("close")) {
							// 需要加强的方法
							// 不将连接真正关闭,将连接放回连接池
							releaseConnection(conn);
							return null;
						} else {
							// 不需要加强的方法
							return method.invoke(conn, args); // 调用真实对象方法
						}
					}
				});
		return connProxy;
	}

	// 将连接放回连接池
	public void releaseConnection(Connection conn) {
		dataSources.add(conn);
		System.out.println("将连接 放回到连接池中 数量:" + dataSources.size());
	}

 

JDBCUtils.getConnection();代码如下
public class JDBCUtils {
	private static final String DRIVERCLASS="";
	private static final String URL="";
	private static final String USER="";
	private static final String PWD="";

	

	// 建立连接
	public static Connection getConnection() throws Exception {
		Class.forName(DRIVERCLASS);
		return DriverManager.getConnection(URL, USER, PWD);
	}

}

  

 实际开发中,我们并不会自己写连接池,一般使用第三方的,比如dbcp或者c3p0或者DRUID(推荐这个)。

posted on 2016-06-30 08:37  一只小蜗牛12138  阅读(131)  评论(0编辑  收藏  举报

导航