DataSourceImpl类中实现getConnection方法的跟正常的数据库连接池的逻辑是一致的,首先判断是否有空闲的连接,如果没有的话判断连接数是否已经超过最大连接数等等的一些逻辑。但是有一点不同的是通过DriverManager得到的数据库连接并不是及时返回的,而是通过一个叫_Connection的类中介一下,然后调用_Connection.getConnection返回的。如果我们没有通过一个中介也就是JAVA中的Proxy来接管要返回的接口对象,那么我们就没有办法截住Connection.close方法。
终于到了核心所在,我们先来看看_Connection是如何实现的,然后再介绍是客户端调用Connection.close方法时走的是怎样一个流程,为什么并没有真正的关闭连接。
/**//** * 数据连接的自封装,屏蔽了close方法 * @author Liudong */ class _Connection implements InvocationHandler ...{ private final static String CLOSE_METHOD_NAME = "close"; private Connection conn = null; //数据库的忙状态 private boolean inUse = false; //用户最后一次访问该连接方法的时间 private long lastAccessTime = System.currentTimeMillis(); _Connection(Connection conn, boolean inUse)...{ this.conn = conn; this.inUse = inUse; } /**//** * Returns the conn. * @return Connection */ public Connection getConnection() ...{ //返回数据库连接conn的接管类,以便截住close方法 Connection conn2 = (Connection)Proxy.newProxyInstance( conn.getClass().getClassLoader(), conn.getClass().getInterfaces(),this); return conn2; } /**//** * 该方法真正的关闭了数据库的连接 * @throws SQLException */ void close() throws SQLException...{ //由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接 conn.close(); } /**//** * Returns the inUse. * @return boolean */ public boolean isInUse() ...{ return inUse; } /**//** * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object) */ public Object invoke(Object proxy, Method m, Object[] args) throws Throwable ...{ Object obj = null; //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态 if(CLOSE_METHOD_NAME.equals(m.getName())) setInUse(false); else obj = m.invoke(conn, args); //设置最后一次访问时间,以便及时清除超时的连接 lastAccessTime = System.currentTimeMillis(); return obj; } /**//** * Returns the lastAccessTime. * @return long */ public long getLastAccessTime() ...{ return lastAccessTime; } /**//** * Sets the inUse. * @param inUse The inUse to set */ public void setInUse(boolean inUse) ...{ this.inUse = inUse; } }
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Java环境安装配置 (5668篇文章)
- 数据库专栏 (5169篇文章)
- 数据库处理专题 (8708篇文章)
- 城域网专题 (7840篇文章)
- 数据库安全技术专题 (13188篇文章)
- 数据库安装与卸载 (10561篇文章)
- Java编程开发手册 (8321篇文章)
- Linux数据库宝典 (13195篇文章)
- 数据库相关文章 (5169篇文章)
- Java应用开发篇 (1088篇文章)
- 精通Hibernate之映射继承关系(四) (0次浏览)
- 何不将Java与.NET合二为一? (0次浏览)
- Hibernate的JNDI名称绑定分析 (0次浏览)
- 精通Hibernate之映射继承关系(一) (0次浏览)
- 精通Hibernate之映射继承关系(二) (0次浏览)
- 美国计算机教授语出惊人:Java对学生有害 (0次浏览)
- JDK 6 JRE 6 Update 4 (0次浏览)
- 三步教你改善Java代码质量 (0次浏览)
- Java语言入门 简述Java语言回收机制 (0次浏览)
- 2008年Java开发者最迫切的五个期望 (0次浏览)



