发表于:2014/4/9 10:04:03
#0楼
最近要把sqlie数据,同步到不同设备上。只需要同步部分表的数据。于是采用在线备分+删除表的方法。备份+删除表+压缩都很快就完成了。结果在传送时,却出错了。原因是有sqlite连接池,无法彻底关闭数据连接。设置关闭连接池也无济于事。在网上找了System.Data.SQLite.SQLiteConnection.ClearAllPools();测试也无效。折腾了半天。最后发现ClearAllPools之后需要稍等待片刻才可以。总结代码:
public override void BeginProcess(Shotgun.Database.BDClass dBase)
{
var dB = (Shotgun.Database.SQLiteDB)dBase;
System.IO.FileInfo dBFile = dB.BackupDataFile(); //备份数据到新文件
try
{
var cs = new SQLiteConnectionStringBuilder();
cs.DataSource = dBFile.FullName;
using (dB = new Shotgun.Database.SQLiteDB(cs.ToString()))
{
RemoveTables(dB);//删除多余的表及压缩数据库
var conn = (SQLiteConnection)((Shotgun.Database.IBaseDataClass2)dB).Connection;//取得连接串
SQLiteConnection.ClearPool(conn);//在连接池中,关闭指定的数据文件(不影响主数据库)
}
GC.Collect();
System.Threading.Thread.Sleep(10);//等待连接池关闭
Transfer(dBFile);//传送新数据文件至客户端
}
finally
{
if (dBFile.Exists)
dBFile.Delete();
}
}