我正在使用Struts 2开发一个java Web应用程序。目前,在每个页面加载时,我建立一个新的数据库连接,然后在请求结束时关闭此数据库连接,就在呈现生成的HTML之前。因此,每个请求都有自己的数据库连接。
我希望在我的模型类中有一堆静态方法,例如像User.exists( id )
这样的东西,如果给定的用户id存在则会返回true,如果不存在则返回false。或其他实用方法,例如User.getEmail(id)
或User.disable(id)
。
我的问题是,有没有一种方便的方法与这些静态方法共享数据库连接?必须将连接作为第二个参数传递给所有这些方法,例如User.exists(id, db)
将是丑陋的,并且不太方便。
如果我在每个实用程序方法中获取新的数据库连接,并在返回结果之前将其关闭,该怎么办?它会对性能产生什么影响?我可能需要在请求中多次调用这些方法20-30次(例如在验证用户输入时)。
答案 0 :(得分:1)
是的,有可能。对于您希望每个Thread都有自己的Connection的情况,您需要使用ThreadLocal,因为每个请求都会生成自己的Thread。您只需确保在请求结束时关闭连接,这可以使用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();
}
}
}
<强> DBFilter 强>:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(request, response);
} finally {
DBUtil.close();
}
}
最好是使用框架来处理这类事情,例如Spring Framework已经通过代理服务来执行此操作,并且它处理连接和事务也为您提供了许多其他功能。