我有一个Xamarin Android项目并使用mono.data.sqlite并且遇到多线程问题,所以我尝试了Zumero组件。我还有问题。我正在尝试将序列化模式设置为http://www.sqlite.org/threadsafe.html中的标志SQLITE_CONFIG_SERIALIZED。我还在随机崩溃。我可以用Zumero设置序列化标志吗?除了从源代码重新编译SQLite之外的任何其他建议吗?
谢谢,
布赖恩
答案 0 :(得分:0)
我曾经遇到过这个问题。尽管这里提出了相互矛盾的建议,但我是如何停止获得例外的:
在所有线程之间共享SQLiteConnection的静态实例。这样做是安全的,因为SQLite连接只是一个文件指针,它不像传统的数据连接。
使用我的SQLiteConnection的statix实例作为锁,将所有SQLite查询/插入/更新包含在互斥锁中。我已经被告知在使用序列化模式时我不应该这样做,但是我的经验不同。
lock(myStaticConnection) {
myStaticConnection.Query<Employee>("....");
}
作为备份,我还使用一些添加的重试逻辑来封装每个查询。不确定SQLite是否单独执行此操作(我已经看到对busytimeout的引用以及声称它现在已经消失的人?)。像这样:
public static List<T> Query<T> (string query, params object[] args) where T : new()
{
return Retry.DoWithLock (() => {
return Data.connection.Query<T> (query, args);
}, Data.connection, 0);
}
public static T DoWithLock<T>(
Func<T> action,
object lockable,
long retryIntervalTicks = defaultRetryIntervalTicks,
int retryCount = defaultRetryCount)
{
return Do (() => {
lock (lockable) {
return action();
}
});
}
public static T Do<T>(
Func<T> action,
long retryIntervalTicks = defaultRetryIntervalTicks,
int retryCount = defaultRetryCount)
{
var exceptions = new List<Exception> ();
for (int retry = 0; retry < retryCount; retry++) {
try{
return action();
} catch (Exception ex) {
exceptions.Add (ex);
ManualSleepEvent (new TimeSpan(retryIntervalTicks));
}
}
throw new AggregateException (exceptions);
}