Android Sqlite数据库实例是线程安全的吗
我有一个数据库和一些表。 我想使用多个线程更新表。 我将在所有线程中使用相同的SQLiteDatabase实例 请说明此方法是否正确。 Sqlite数据库是线程安全的吗?Android Sqlite数据库实例是线程安全的吗,android,sqlite,locking,thread-safety,Android,Sqlite,Locking,Thread Safety,我有一个数据库和一些表。 我想使用多个线程更新表。 我将在所有线程中使用相同的SQLiteDatabase实例 请说明此方法是否正确。 Sqlite数据库是线程安全的吗? 两个不同的线程可以同时为不同的值集更新同一个表。[错误:]否,默认情况下它不是线程安全的。您应该使用与锁定相关的SQLiteHelper方法来提供线程安全性 [Ed]:SQLDeDATABASE类提供了一个锁定机制默认为(请参阅注释),如果您在多线程上运行,则不必考虑更改任何线程安全性。p> 在此文档中搜索“线程”: 请阅读
两个不同的线程可以同时为不同的值集更新同一个表。[错误:]否,默认情况下它不是线程安全的。您应该使用与锁定相关的SQLiteHelper方法来提供线程安全性
<强> [Ed]:SQLDeDATABASE类提供了一个锁定机制<强>默认为(请参阅注释),如果您在多线程上运行,则不必考虑更改任何线程安全性。p> 在此文档中搜索“线程”:
请阅读以下内容:- 如果你成功了
setLockingEnabled(布尔值lockingEnabled)
通过在关键部分周围使用锁来控制SQLiteDatabase是否具有线程安全性。您可以通过以下方式控制数据库是否具有线程安全性 通过在关键部分周围使用锁来控制SQLiteDatabase是否是线程安全的。这是相当昂贵的,所以如果您知道您的数据库将只由一个线程使用,那么您应该将其设置为false。默认值为true 所以我认为这回答了你的问题
setLockingEnabled方法在API级别16中被降级,Android使用java锁定机制保持SQLite数据库访问序列化。所以,如果多个线程有一个db实例,它总是以序列化的方式调用数据库,当然数据库是线程安全的 如果我们确认使用的是来自单线程的数据库,我们可以通过调用
setLockingEnable(false)
来设置数据库内部锁定禁用,但此方法来自API级别16,不再使用。如果您在SQLiteDatabase
类中看到此方法的实现,您将发现其中没有写入任何内容,即空方法
public void setLockingEnabled (boolean lockingEnabled)
此方法现在不起任何作用。请勿使用。
我们应该注意的一件事是,我们应该为您的helper类创建一个实例(即使其成为单实例),并将同一实例共享给多个线程,并且在操作之间不要调用数据库上的close()
,否则您可能会遇到以下异常:
java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase
因此,不要调用
database.close()
在访问数据库之间,当所有操作完成时,数据库将在内部自行执行close操作。通过在关键部分周围使用锁来控制SQLiteDatabase是否具有线程安全性。这是相当昂贵的,所以如果您知道您的数据库将只由一个线程使用,那么您应该将其设置为false。默认值为true
。。。这不意味着默认情况下它是线程安全的吗?嗯,应该是的,现在我错了。Hmm.“此方法在API级别16中被弃用。此方法现在不起任何作用。请勿使用。”因此,现在当该方法被弃用时,SQLiteDatabase实例在任何情况下都不是线程安全的?@Ivan请参阅:…如果无法获取数据库连接以执行特定操作,线程可能会阻塞。
可能的重复项您应该使用“是”中所述的锁定。调用时,我有一些错误sqLiteHelper。在ondestory
中关闭。那么我应该怎么做呢?根本不叫它?当所有操作完成时,数据库将在内部自行执行关闭操作。但是public SQLiteDatabase getwriteabledatabase()
说,当您不再需要数据库时,请确保调用close。