• 连接池技术


    我们知道,使用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(推荐这个)。

  • 相关阅读:
    Zend Guard 7 , Zend Guard Loader处理PHP加密
    [转]pHP源码加密方法调查
    使用USB Key(加密狗)实现身份认证
    4*4行列式矩阵键盘
    HDU-2546-饭卡
    HDU-2073-无限的路
    HDU-2065-"红色病毒"问题
    HDU-2063-过山车
    HDU-2060-Snooker
    HDU-2056-Rectangles
  • 原文地址:https://www.cnblogs.com/javabigdata/p/5628815.html
Copyright © 2020-2023  润新知