是否可以始终打开数据库连接?

时间:2011-03-29 14:30:52

标签: database

我在业余时间处理单用户桌面数据库应用程序,我总是不确定我正在做的设计选择。现在,就目前而言,每当用户想要与数据库(这是一个本地SQLite数据库,因此通常只有一个用户一次看到它)进行交互时,应用程序就会创建一个新连接,做它需要做的任何事情,然后关闭连接。因此,在一次执行应用程序的过程中,会创建和处理大量连接。

这通常是“最佳”的方式,或者应用程序是否应该在启动时打开连接并且只在应用程序退出时关闭它?每种方法的优点/缺点是什么?

7 个答案:

答案 0 :(得分:23)

我认为在这种情况下它很好,因为只有一个用户,数据库托管在同一台机器上(更可能在同一个内存空间,因为我认为SQLite只是作为一个DLL加载到主机应用程序)作为应用程序。不必打开和关闭连接。

如果您需要让应用程序的多个线程同时访问数据库,则可能存在一个例外。然后你可以强迫他们等待并共享一个连接对象, OR 你可以尝试为不同的线程创建新的连接。我从来没有在SQLite中尝试过这个。在这种情况下,关闭主连接和打开/关闭多个连接可能对桌面应用程序更好。

对于Web应用程序或客户端/服务器桌面应用程序,我建议不要打开连接。

答案 1 :(得分:7)

通常连接在使用后关闭;将其释放回可用连接池中。如果在单个客户端上发生大量事务,则利用单个连接而不是仅创建多个连接以立即关闭它们是有意义的。

这有点间接,但典型的最佳做法是在使用后将其关闭,以便再次在池中使用。

答案 2 :(得分:6)

想象一下,您有1000个用户同时访问您的应用程序。这意味着1000个开放连接。最终你可能会用尽连接。因此,让每个用户打开一个连接,使用它,然后关闭它,以便其他人可以免费使用连接。

进一步澄清

想象一下,他有多个同时需要相同连接的模块?图像同时运行需要连接的控件。他要做什么?有一个全局连接对象?使用单身人士模式?告诉我,如果我错了

答案 3 :(得分:1)

在处理数据库连接时,我的策略取决于你需要做什么。例如,如果您正在加载大量已经发现的关键数据,那么我的目的就是将所有操作封装在一个事务中,并且在提交事务后应该关闭一个应该关闭的连接。

现在,如果您需要执行大量查询检索数据,那么为每个查询打开关闭连接可能会非常昂贵,因此打开连接是值得的。

答案 4 :(得分:1)

连接池应该使这成为一个有争议的问题。池应保持连接并打开以供您重用。这应该允许您遵循通常最佳的使用资源的最佳实践,但不会牺牲性能。

答案 5 :(得分:1)

我刚开始问自己同样的问题。和你一样,它只是一个应用程序而且我并不担心用完连接。

然而,我确实遇到了将数据库保持打开的潜在问题:交易。如果您执行了BEGIN TRANSACTION,如果您的代码未点击COMMITROLLBACK,则会出现错误或其他问题,那么您可以将该交易保留为开启状态。

因此,关闭它可能更好,只是为了确保在完成数据库工作后恢复所有内容。

我真的不知道打开和关闭数据库有多少开销。我很想听听别人对此的看法。

答案 6 :(得分:0)

打开新连接非常昂贵。 因此,使用连接的最佳方法是在完成事务后将其标记为空闲。然后,该连接将返回到空闲连接池中。

当应用程序请求连接时,代码必须检查空闲的{free}连接池并返回一个。如果池中没有空闲连接,则应使用新连接。当提供服务或实体的连接时,该连接必须标记为“活动”。这样就不会将连接提供给任何后续请求。

未关闭连接时,必须正确处理有关提交,回滚等的连接。

检查您的语言或框架。大多数框架已经维护了空闲连接的容器。因此,您无需担心。 某些语言还提供了开箱即用的功能。例如,Golang核心程序包类型sql.DB维护一个空闲连接池,该池可以同时使用,因此您不必担心关闭连接。