【问题标题】:Should a database connection stay open all the time or only be opened when needed?数据库连接应该始终保持打开状态还是仅在需要时才打开?
【发布时间】:2013-09-28 13:29:13
【问题描述】:

我有一个需要连接到数据库的 bukkit 插件(我的世界)。

数据库连接应该一直保持打开状态,还是在需要时打开和关闭?

【问题讨论】:

    标签: java mysql jdbc bukkit


    【解决方案1】:

    数据库连接必须仅在需要时打开,并在完成所有必要工作后关闭。代码示例:

    • 在 Java 7 之前:

        Connection con = null;
        try {
            con = ... //retrieve the database connection
            //do your work...
        } catch (SQLException e) {
            //handle the exception
        } finally {
            try {
                if (con != null) {
                    con.close();
                }
            } catch (SQLException shouldNotHandleMe) {
                //...
            }
        }
      
    • Java 7:

        try (Connection con = ...) {
        } catch (SQLException e) {
        }
        //no need to call Connection#close since now Connection interface extends Autocloseable
      

    但由于手动打开数据库连接的成本太高,强烈建议使用database connection pool,用Java 表示,带有DataSource 接口。这将为您处理物理数据库连接,当您关闭它(即调用Connection#close)时,物理数据库连接将仅处于睡眠模式并仍处于打开状态。

    相关问答:

    一些处理数据库连接池的工具:

    【讨论】:

      【解决方案2】:

      取决于您的需求。

      创建连接需要一些时间,因此如果您需要频繁访问数据库,最好保持连接打开。另外最好创建一个池,以便许多用户可以同时访问数据库(如果需要)。

      如果你只需要使用这个连接几次,你可能不会保持它打开,但是当你想访问数据库时你会延迟。所以我建议你做一个定时器来保持连接打开一段时间(连接超时)。

      【讨论】:

        【解决方案3】:

        您需要在每次查询执行后关闭连接。有时您需要同时执行多个查询,因为查询彼此挂起。例如“先插入任务然后将其分配给员工”。此时时间在同一个事务上执行您的查询并提交它,如果发生一些错误则回滚。默认情况下,自动提交在 JDBC 中是禁用的。 Example

        使用连接池。如果您正在开发 Web 应用程序,则使用 App Server 连接池。App 服务器将为您的每个应用程序使用相同的池,因此您可以从一个点控制连接数。强烈推荐 Apache Tomcat 连接池化。Example

        作为附加信息: 连接、语句和结果集。

        1.如果关闭连接,则不需要关闭语句或结果集。它们都会自动关闭

        2.如果你关闭Statement,它也会关闭ResultSet

        3.如果你像这样使用 try-with-resources:

        try (Connection con = ...) {
        } catch (SQLException e) {
        }
        

        它会自动关闭连接。因为 try-with-resources 需要自动关闭的对象,而 Connection 是自动关闭的。您可以查看有关 try-with-resources 的详细信息here

        【讨论】:

          【解决方案4】:

          实际上,关键在于您如何编写应用程序!这是一门艺术,但遗憾的是,每个人都需要一个教程来获得良好的实践,就像微软的教程一样。

          如果您知道自己在编码什么,那么您可以在应用程序的整个生命周期内保持连接打开。很简单,不是因为你早上要上班,我们每天都要为你打造一条特别的路线!你像每个人一样走那条路线或 2 或 4 条路线!您判断流量并根据需要构建 2、4 或 6 条路线。如果这 4 或 6 条路线有交通拥堵,请稍等!

          编码愉快。

          【讨论】:

          • 关于数据库连接和每个人每天上班通勤的好类比。
          【解决方案5】:

          仅在需要时才应打开连接。如果它在实际需要之前打开,它会从连接池中减少一个活动连接。所以它最终会影响应用程序的用户。

          因此,最好只在需要时打开连接并在完成过程后关闭它。

          始终尝试将您的连接关闭逻辑放入 finally 块中,这将确保您的连接将被关闭,即使应用程序中发生任何异常

          finally
          {
          connection.close()
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-04
            • 1970-01-01
            • 1970-01-01
            • 2011-05-25
            • 1970-01-01
            相关资源
            最近更新 更多