如何防止System.Data.SQLite ADO.NET提供程序打开新文件来处理对数据库的每次访问?

问题描述

我正在使用LINQ to SQLSystem.Data.SQLite用C#访问小型SQLite数据库。

这是我用来从数据库读取数据的典型代码:

var context = new MyDataContext();
var foo = context.GetTable<Foo>().Single(x => x.Id == ...);

MyDataContext.cs:

public class MyDataContext : DataContext
{
    public MyDataContext() :
        base(new SQLiteConnection(@"Data Source=somefile.db"))
    {
    }
}

我很想将DataContext放入using语句(因为它是IDisposable)或使用单例,但是我发现的几乎所有示例(包括在书中)都会为每次使用创建一个新的DataContext。 Microsoft says就是这样:

通常,DataContext实例旨在持续一个“工作单元”,但是您的应用程序定义了该术语。 DataContext是轻量级的,并且创建起来并不昂贵。典型的LINQ to SQL应用程序在方法范围内或作为表示相关数据库操作的逻辑集的短期类的成员来创建DataContext实例。

我一直想知道SQLite数据库文件何时在后台打开/关闭。我期望维护某种类型的池(例如SQLConnection)。结果令人惊讶。

如果我运行此命令:

for (int i = 0 ; i < 500 ; i++)
{
    using(var context = new MyDataContext())
    {
        var foo = context.GetTable<Foo>().ToList();
    }
}

似乎SQLite db文件已打开多次但从未关闭。实际上,在停止应用程序的确切时刻,我在Process Monitor中得到了500行:

enter image description here

哎呀

我试图通过编写以下代码来改善它:

using (var context = new MyDataContext())
{
    for (int i = 0 ; i < 500 ; i++)
    {
        var foo = context.GetTable<Foo>().ToList();
    }
}

它是相同的(500个CloseFile调用)。看来文件打开是在调用GetTable<T>().ToList()的确切时间完成的,而不是像我想的那样实例化DataContext时。

这当然是不可接受的。我是在做错什么,还是System.Data.SQLite的限制?我该如何改善?我希望在使用后立即关闭文件,或者至少减少在应用程序生命周期中打开的文件句柄数量。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)