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

And*_*old 25 database

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

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

Fru*_*ner 27

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

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

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

  • 你可能是第一个回答完全真正阅读过问题的人. (3认同)
  • @Andrew:你确定这不仅仅是第一个同意你原有观点的答案吗?利用连接池将允许您的应用程序重新使用一个保持打开的单个连接,但无需围绕该决策构建应用程序.您仍然可以编写仅在需要时获取和释放连接资源的代码. (2认同)
  • @qes:SQLite不支持连接池,因此它不相关. (2认同)
  • @Andrew Arnold 这确实是 SQLite 特有的本地化案例;今后请牢记这一点。一方面,您声称自己正在使用 SQLite,但似乎想知道形成普遍立场的途径;另一方面,您似乎想知道 SQLite 中的最佳实现。不同的动物。 (2认同)

Aar*_*ver 8

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

它有点间接,但典型的最佳做法是在使用后关闭它,以便它再次在池中可用.

  • 由于OP正在谈论单一使用本地SQLite数据库,因此连接池并不真正相关. (6认同)
  • @gnuchu OP正在询问最佳做法.仅仅因为OP没有明确说出来回答这些类型的问题时,现在和将来适用于这种情况的预扣信息对OP是不公平的.如果向OP提供额外信息则不赞成; 所以吧......当其他人扩展我的问题并触及我以前可能没有意识到的事情时,我个人很感激. (6认同)
  • 提及连接池的+1.通常,连接池保持连接打开,应用程序检索/返回池中的连接.连接可以持续数月或数年.连接池还可用于限制数据库访问并提高吞吐量.打开1000个连接将阻塞数据库和应用程序,但如果只有5个连接可用,则每个事务将快速完成,并且应用程序将具有相当大的吞吐量.池大小取决于应用程序,需要调整 (3认同)
  • @gnuchu:这是绝对相关的。使用连接池可获得使连接保持打开状态的性能,同时允许结构化代码以最少的数量获取和释放资源。 (2认同)

Imr*_*hsh 6

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

进一步澄清

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

  • 它实际上是桌面应用程序的一个很好的设计.事实上,这是这类应用的常态,并且已经持续了数十年.它工作正常,可靠,并且比连续重新打开连接表现更好. (3认同)