JavaSQLite连接和资源,良好实践
下面的场景是一个好的实践吗?它有任何缺点或缺陷吗
一个单态
DatabaseHelper
扩展SQLiteOpenHelper
在我的
DAO
类中,我调用databaseHelper.getWritableDatabase()
,它返回SQLiteDatabase
在所有
DatabaseHelper
或任何SQLiteDatabase
实例中都没有手动close()
因此,这基本上应该在应用程序的整个生命周期中保持连接。我认为当应用程序被破坏时,数据库连接将自动关闭,资源将被释放。而且我认为它是线程安全的
我说得对吗
# 1 楼答案
通常推荐使用单例设计模式来处理SQLiteDatabase
在这里我不同意。我宁愿在SQLiteOpenHelper实现类中创建这样的方法,并在DAO类中使用这些方法
这在很大程度上取决于应用程序的类型,但通常情况下,如果不使用数据库,它应该始终关闭。Simplified表示:当您需要执行任务时,请执行它,当所有工作完成时,关闭并释放源
继续
但我们讨论的是单线程应用程序。在多线程(并发)应用程序中,存在同时从多个线程访问一个数据库的问题。SQLiteDatabase在默认情况下不是线程安全的(只有当您使用的是ContentProvider,而您不使用它时才是如此。也许文档会说一些不同的东西,但现实是在其他地方)
但是这里出现了一些机制,比如使用同步方法进行读写、同步块等。所以我认为一开始就足以使方法正确同步,然后在一些测试之后逐步进行改进
你的问题占用了“很多空间”,而且这个问题非常困难,需要时间来正确实现——如果你正在做一个可以使用数千人的大项目,那么在这里正确实现SQLiteDatabase是必要的,因为多线程是必要的
# 2 楼答案
我正在使用类似于你上面介绍的东西。不同之处在于,我在单例中保留了
SQLiteDatabase
对象,并为CRUD
操作提供了包装方法,并在这些操作中同步了SQLiteDatabase
对象,这样类的用户就不会直接访问SQLiteDatabase
对象,除非它是同步的我不确定你使用的方法是否是线程安全的,因为你没有发布一些代码,但如果你没有使用同步机制,那么我认为它不是,因为我不认为
getWritableDatabase()
方法可以为你做到这一点编辑
正如Petar提到的,这似乎是一种默认的同步机制,所以我认为您使用的逻辑应该可以正常工作