2014-02-20 48 views
0

我想了解多线程访问ATTACHED sqlite数据库所涉及的问题。显而易见的是,一个SQLiteOpenHelper可确保一个数据库连接,从而确保对数据库的一个序列化访问。当一个“子”数据库连接两次,在两个不同的“父”SQLiteOpenHelper s /两个不同的父数据库连接下时会发生什么?Android中的附加sqlite数据库和多线程问题

Q1:如何访问连接的子数据库序列化?问题2:在这种情况下如何提前写入日志记录?

需要明确的是,这是我所描述的情景:

ASQLiteOpenHelper instanceA = new ASQLiteOpenHelper(context, dbnameA, null, version); 
BSQLiteOpenHelper instanceB = new BSQLiteOpenHelper(context, dbnameB, null, version); 

instanceA.getWritableDatabase().execSQL("ATTACH '" + dbnameChild + "' AS child"); 
instanceB.getWritableDatabase().execSQL("ATTACH '" + dbnameChild + "' AS child"); 

通过instanceAinstanceB同时安全写入“孩子”?阅读怎么样?如果为家长启用writeahead日志记录,是否也为孩子启用?如果是,是为child创建的两个单独的预写日志记录吗?

+0

看起来'DB'是一个共享资源,'SQLiteOpenHelpers'的多个实例正在访问'DB'。请纠正我,如果我错误解释你的情况。 – guptakvgaurav

+0

我认为你错误地解释了我的情况。有三个独立的数据库:dbnameA,dbnameB和dbnameChild。这两个助手每个都打开一个不同的数据库。但是,第三个数据库dbnameChild连接到两个助手下。 – zyamys

+0

因此,dbnameChild是两个助手的共享资源。是不是 – guptakvgaurav

回答

0

经过一番测试,我发现ATTACH ed数据库将被锁定在第一个ATTACH尝试。进一步ATTACH尝试将失败。

0

here

我们都知道,作为支持多 作为并发的SQLite没有其他嵌入式SQL数据库引擎的。 SQLite允许多个进程一次打开数据库文件,并允许多个进程一次读取数据库 。当任何进程想要写入时,它必须在整个数据库文件更新期间锁定整个数据库文件。但通常 只需要几毫秒。其他进程只需等待作者 完成,然后继续他们的业务。其他嵌入式SQL数据库引擎通常只允许单个进程一次连接到数据库。

here是关于并发性的大量信息。

+0

谢谢,但这并没有解决我的问题,因为Android中锁定的数据库将导致运行时异常。这就是SQLiteOpenHelper用作单例的原因 - 确保只有一个数据库连接用于读/写。我的问题是关于在多线程场景中附加数据库的结果。 – zyamys

+0

@zyamys我应该读得更好..这是深夜在这里! :( – Merlevede