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