连接池技术
我们知道,使用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 阅读(137) 评论(0) 收藏 举报
浙公网安备 33010602011771号