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中的另一个“东西”。所以你总是需要尽最大努力,不要相信任何人:)