【发布时间】:2014-04-06 21:58:53
【问题描述】:
这类问题被问了很多,但我找不到任何让我满意的答案。
问题
我应该如何在多个线程上维护多个打开的 SQLite 连接?
是否可以检查打开了多少连接并仅在没有连接时才调用 close() ?
编辑
我接受了下面的答案,因为 SQLite 非常快,并且同步所有 sql API 方法(一次只运行一个)可能不会太伤人。
话虽如此,我仍然很高兴听到同步 read()s 和 write()s 的解决方案,以便可以一次完成多个 read()...
背景
我正在构建一个 Android 应用程序,在某些地方我使用的 Internet 连接很少(GET 请求)。
当这些请求完成时,它们的所有线程都访问 SQLite,大部分用于编写。
当线程尝试同时连接时,我收到标题中提到的错误。
我知道为什么会这样:
我这样做的方式是,每个“SQLite API”方法(我编写的 API)都是从打开连接开始并通过关闭它来完成的。需要时使用写入/读取 open()。
因此,当一个线程关闭连接(API 方法完成)而另一个仍在使用游标或其他线程时,会发生错误并引发此异常。
下面是一个代码示例来演示:
public class MySQL{
private SQLiteOpenHelper mHelper;
private SQLiteDatabase myDatabase;
private static MySQL myInstance;
...
//singleton
public synchronized static MySQL getInstance(Context context){
if(myInstance == null){
myInstance = new MySQL(context);
}
synchronized (myInstance) {
return myInstance;
}
}
public SQLiteDatabase openRead() throws SQLException{
return myDatabase = mHelper.getReadableDatabase();
}
public SQLiteDatabase openWrite() throws SQLException{
return myDatabase = mHelper.getWritableDatabase();
}
//close helper
public void close(){
mHelper.close();
}
public static void createSomeEntry(){
openWrite();
myDatabase.query(...);
...
close();
}
public static void getSomeEntry(){
openRead();
Cursor c = myDatabase.query(...);
...//use cursor in a loop
close();
}
}
因此,假设这些方法的任何两个组合同时从不同的线程运行。
如您所见,我尝试同步“myInstance”的使用/持有,希望只要一个线程持有这个变量,它就是唯一可以使用它的线程。
它显然不起作用,而且它只会减慢一切,我更喜欢更好的东西。
我该如何解决这个逻辑?
【问题讨论】:
标签: java android multithreading sqlite