每次重连SQLite连接还是重复使用连接?

8

我正在制作一个使用SQLite数据库存储产品信息的Java应用程序。为了获取信息,我创建了一个带有静态方法的类,并且使用了静态变量private static Connection c,以便它在程序结束之前保持活动状态。

public static void Init() {
    try {
        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:test.db");
        crearTablas();
    } catch (Exception e) {
        System.err.println(e.getClass().getName() + ": " + e.getMessage());
        System.exit(0);
    }
    System.out.println("Opened database successfully");
}

进行了多个查询。我应该在每个查询结束时关闭数据库连接,还是保持活动状态并重复使用(使用静态方法停止使用程序时再关闭)?

该应用程序是为 Windows 系统设计的(计算机商店的库存控制),而不是为手机设计的。


3个回答

8
SQLite的最佳实践是在程序生命周期内保持单个连接。关闭和打开连接不会节省太多内存,因为SQLite没有保留太多状态(唯一显著的内存使用是页面缓存,其大小可以配置),而这些操作所需的时间(例如重新读取数据库结构)比将要使用的内存更糟糕。
至于并发性,有多个打开的连接(来自单个进程或多个进程)不会出现问题,因为只有当事务处于活动状态时才会锁定数据库。

“最佳实践”是无意义的。这在这个问答中得到了很好的说明,其中两个答案声称截然相反的方法是“最佳实践”。请参见https://www.satisfice.com/blog/archives/5164。 - Stephen C
是否有像MySQL一样带有“重新连接”选项的连接方法?场景是长时间运行的应用程序可能会由于sqlite暂时不可用(服务重启、备份或其他来自操作系统层面的原因)而短暂地断开连接。那么,您该如何处理这种情况?也许最好不要相信连接总是存在,并在需要时简单地进行连接,然后在之后断开连接。 - papajony
1
@papajony SQLite不作为服务运行,它是基于文件的;没有网络连接。 - CL.
@CL 谢谢。既然是这种情况,那么我认为保持连接开放的论点似乎非常薄弱。我特别指的是嵌入式系统,程序一直运行。你只在需要时打开连接,然后关闭它。保持连接永远开放没有真正的优势。 - papajony

3
SQLite的最佳实践是在每个函数执行后关闭连接,并在函数开始时打开连接。通过关闭和打开连接,您可以节省内存,而这些操作所需的时间不如将要使用的内存重要。
您可以参考此文章了解SQLite的最佳实践。

1
如果你制作的是Windows应用程序,我想你不必太担心内存问题,因此最好始终保持连接开放。 - Yann Thibodeau
“最佳实践”是无意义的。这在这个问答中清楚地说明了,其中两个回答声称截然相反的方法是“最佳实践”。请参见https://www.satisfice.com/blog/archives/5164。 - Stephen C

1

或者使用内容提供者,无需担心打开和关闭数据库,它会自行处理。-参考资料

(尽管流行的观点认为只有在您想要在多个应用程序之间共享数据时才应使用内容提供者,但如果将其用于仅访问本地数据,则非常有益。)

在此处查看讨论


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接