gpt4 book ai didi

java - 在Java中使用静态方法共享数据库连接

转载 作者:行者123 更新时间:2023-11-29 13:31:11 41 4
gpt4 key购买 nike

我正在使用 Struts 2 开发一个 Java Web 应用程序。目前,在每个页面加载时,我都会建立一个新的数据库连接,然后在请求结束时、渲染生成的 HTML 之前关闭此数据库连接。因此,每个请求都有自己的数据库连接。

我想在我的模型类中拥有一堆静态方法,例如 User.exists( id ) 之类的东西,如果给定的用户 id 存在,则返回 true,如果不存在,则返回 false' t。或者其他实用方法,例如 User.getEmail(id)User.disable(id)

我的问题是,有没有一种方便的方法来与这些静态方法共享数据库连接?必须将连接作为第二个参数传递给所有这些方法,例如 User.exists(id, db) 会很丑陋,而且不太方便。

如果我在每个实用程序方法中获取一个新的数据库连接,并在返回结果之前将其关闭,会怎么样?会对性能有什么影响吗?有时我可能需要在一个请求中调用这些方法 20-30 次(例如验证用户输入时)。

最佳答案

是的,这是可能的。对于这种情况,您希望每个线程都有自己的连接,您需要使用 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已经通过代理您的服务来做到这一点,它处理连接和事务还为您提供了许多其他功能。

关于java - 在Java中使用静态方法共享数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19436307/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com