multithreading - 如何管理服务器上的数据库连接?

标签 multithreading postgresql servlets jdbc

我的 Web 应用程序中的数据库连接存在严重问题。由于我对单例数据库类的整个应用程序使用单个数据库连接,如果我尝试并发数据库操作(两个用户),数据库将回滚事务。 这是我使用的静态方法:

所有线程/servlet 调用静态 Database.doSomething(...) 方法,这些方法又调用下面的方法。

private static /* synchronized*/ Connection getConnection(final boolean autoCommit) throws SQLException {
    if (con == null) {
        con = new MyRegistrationBean().getConnection();
    }
    con.setAutoCommit(true); //TODO
    return con;
}

管理我拥有的这个数据库连接的推荐方法是什么,这样我就不会遇到同样的问题。

最佳答案

Connection 永远打开是一个非常糟糕的主意。它没有无限的生命周期,只要数据库超时并关闭它,您的应用程序就可能崩溃。最佳做法是在最短中获取关闭ConnectionStatementResultSet避免资源泄漏和由泄漏和超时引起的潜在应用程序崩溃的可能范围。

由于连接数据库是一项昂贵的任务,您应该考虑使用连接池来提高连接性能。一个体面的应用程序服务器/servlet 容器通常已经提供了 JNDI DataSource 风格的连接池功能。有关如何创建它的详细信息,请参阅其文档。例如 Tomcat,您可以找到它 here .

即使在使用连接池时,您仍然必须编写正确的 JDBC 代码:在尽可能短的范围内获取关闭所有资源。连接池将依次担心实际关闭连接或只是将其释放回池以供进一步重用。

您可能会从 this article 中获得更多见解如何以正确的方式学习 JDBC 基础知识。作为完全不同的选择,学习 EJB 和 JPA。它将为您抽象出所有 JDBC 样板文件到单行代码中。

希望这对您有所帮助。

另见:

关于multithreading - 如何管理服务器上的数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979415/

相关文章:

java - 同样的计算怎么会产生不同的结果

c# - 如何确保 Windows 服务计时器生成的线程在停止 Windows 服务后完成执行?

postgresql - Docker 和 postgresql : server closed the connection unexpectedly (MacOS Catalina)

java - Tomcat webapps 服务器独立吗?

java - 为什么 Servlet.service() 方法返回 void 而不是 ServletResponse 的实例?

java - 从 Java servlet 中的 POST 请求获取请求负载

java - 我应该在线程中声明变量还是在Android中创建一个全局变量?

java多线程访问原始变量

ruby - 使用 rvm 在 Mac OS Lion 上安装 pg gem

Postgresql:如何使用 Mac OS X 查找 pg_hba.conf 文件