是的,有可能。对于这种您希望每个线程都有自己的连接的情况,您需要使用ThreadLocal,因为每个请求都会产生自己的线程。您只需要确保在请求结束时关闭连接,这是使用Filter实现的。
过滤器应该在任何其他过滤器之前,以确保连接在请求结束时关闭。
DBUtil:
public class DBUtil {
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();
public static Connection getConnection() {
Connection connection = connectionHolder.get();
if (connection == null) {
//open the connection (lazy loaded)
//store it
connectionHolder.set(connection);
}
return connectionHolder.get();
}
public static void close() {
Connection connection = connectionHolder.get();
if (connection != null) {
//close the connection
//remove it from the connection holder
connectionHolder.remove();
}
}
}
数据库过滤器:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(request, response);
} finally {
DBUtil.close();
}
}
如果你为这类事情使用框架会更好,例如Spring Framework已经通过代理你的服务来做到这一点,它处理连接和事务还为你提供了许多其他功能。