Java SQLite连接和资源,良好实践

Java SQLite连接和资源,良好实践,java,android,sqlite,Java,Android,Sqlite,下面的场景是一个好的实践吗?它是否有任何缺点或缺陷 一个单例DatabaseHelper扩展SQLiteOpenHelper 在我的DAO类中,我调用databaseHelper.getwriteabledatabase(),它返回SQLiteDatabase 在所有DatabaseHelper或任何SQLiteDatabase实例上都没有手动close() 因此,这基本上应该在应用程序的整个生命周期中保持连接。我认为当应用程序被破坏时,数据库连接将自动关闭,资源将被释放。而且我认为它是线程安全

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

  • 一个单例
    DatabaseHelper
    扩展
    SQLiteOpenHelper

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

  • 在所有
    DatabaseHelper
    或任何
    SQLiteDatabase
    实例上都没有手动
    close()

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


    我说得对吗?

    我正在使用类似于您上面介绍的东西。不同之处在于,我将
    SQLiteDatabase
    对象保留在单例中,并为
    CRUD
    操作使用包装器方法,并在这些操作中同步
    SQLiteDatabase
    对象,因此除非同步,否则类的用户将无法直接访问
    SQLiteDatabase
    对象

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

    编辑

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

    一个扩展SQLiteOpenHelper的单例数据库助手

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

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

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

    在所有DatabaseHelper或任何 SQLITE数据库实例

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

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

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


    您的问题占用了“很大的空间”,而且这个问题非常困难,需要时间来正确实施-如果您正在进行一个可以使用数千人的大型项目,那么在这里正确实施SQLiteDatabase作为多线程是必要的。

    谢谢您的回答!但是
    SQLiteDatabase
    的实现不是线程安全的吗?这里写到它是同步的-谢谢你的回答<代码>也许医生说了一些不同的话,但现实在别处。你遇到什么问题了吗?@PetarMinchev Petar我怎么说。。。我和我的同事都不得不面对很多问题,不仅仅是SQLiteDatabase,还有Android中的另一个“东西”。所以你总是需要尽最大努力,不要相信任何人:)