有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSQLite连接和资源,良好实践

下面的场景是一个好的实践吗?它有任何缺点或缺陷吗

  1. 一个单态DatabaseHelper扩展SQLiteOpenHelper

  2. 在我的DAO类中,我调用databaseHelper.getWritableDatabase(),它返回SQLiteDatabase

  3. 在所有DatabaseHelper或任何SQLiteDatabase实例中都没有手动close()

因此,这基本上应该在应用程序的整个生命周期中保持连接。我认为当应用程序被破坏时,数据库连接将自动关闭,资源将被释放。而且我认为它是线程安全的

我说得对吗


共 (2) 个答案

  1. # 1 楼答案

    One singleton DatabaseHelper extending SQLiteOpenHelper

    通常推荐使用单例设计模式来处理SQLiteDatabase

    In my DAO classes I call databaseHelper.getWritableDatabase() which returns SQLiteDatabase.

    在这里我不同意。我宁愿在SQLiteOpenHelper实现类中创建这样的方法,并在DAO类中使用这些方法

    No manual close() at all of DatabaseHelper or any of the SQLiteDatabase instances.

    这在很大程度上取决于应用程序的类型,但通常情况下,如果不使用数据库,它应该始终关闭。Simplified表示:当您需要执行任务时,请执行它,当所有工作完成时,关闭并释放源

    继续

    但我们讨论的是单线程应用程序。在多线程(并发)应用程序中,存在同时从多个线程访问一个数据库的问题。SQLiteDatabase在默认情况下不是线程安全的(只有当您使用的是ContentProvider,而您不使用它时才是如此。也许文档会说一些不同的东西,但现实是在其他地方)

    但是这里出现了一些机制,比如使用同步方法进行读写、同步块等。所以我认为一开始就足以使方法正确同步,然后在一些测试之后逐步进行改进

    你的问题占用了“很多空间”,而且这个问题非常困难,需要时间来正确实现——如果你正在做一个可以使用数千人的大项目,那么在这里正确实现SQLiteDatabase是必要的,因为多线程是必要的

  2. # 2 楼答案

    我正在使用类似于你上面介绍的东西。不同之处在于,我在单例中保留了SQLiteDatabase对象,并为CRUD操作提供了包装方法,并在这些操作中同步了SQLiteDatabase对象,这样类的用户就不会直接访问SQLiteDatabase对象,除非它是同步的

    我不确定你使用的方法是否是线程安全的,因为你没有发布一些代码,但如果你没有使用同步机制,那么我认为它不是,因为我不认为getWritableDatabase()方法可以为你做到这一点

    编辑

    正如Petar提到的,这似乎是一种默认的同步机制,所以我认为您使用的逻辑应该可以正常工作