一般情况下,我们的项目中都有一个获取数据库连接的方法。

我获取数据库连接的方法是这样实现的:

1. 创建一个 ComboPooledDataSource对象,使用它的getConnection()方法获取连接。

2. 创建一个泛型为Connection的ThreadLocal<Connection>对象,用它的get()方法取出当前方法保存的数据库连接,用它的set(Connection conn)方法添加连接并返回。

具体代码:

private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); // 创建ThreadLocal对象 
private static ComboPooledDataSource dataSourcedataSource = new ComboPooledDataSource(); // 创建数据源对象 
/** *  * @Title: 
getConnection * @author GNODIAD * @date 2014-11-6 
上午10:54:33 * @Description: |-- 
获取数据库连接的方法 * @return 获取到的数据库连接 * @throws 
SQLException 可能抛出的异常 * */
public static Connection getConnection() throws SQLException { /* *  1). 
从ThreadLocal中取出当前线程保存的数据库连接 *  2). 
如果没有数据库连接或者连接已经关闭,就创建一个数据库连接, *     
并将数据库连接添加到ThreadLocal中并返回这个连接 *  3). 
如果有数据库连接,直接返回数据库连接 */Connection conn = 
threadLocal.get(); if (conn == null || conn.isClosed()) 
{// 【错误的产生就是这一句没有判断连接是否关闭】 conn = 
dataSource.getConnection(); // 创建连接 threadLocal.set(conn); 
// 添加连接到ThreadLocal中 } return conn; // 返回连接 
}

问题就出在连接关闭后还没有重新获取就使用了。所以错误信息就提示你,你不能在一个已经关闭的连接上操作。