c# - 用于 sqlite 的 ServiceStack.Ormlite 运行时间非常慢

标签 c# sqlite servicestack

我在 Windows 7 上使用 ServerStack.OrmLite 4.0。 我使用 OrmLite 创建了一个表,并在 Sqlite 文件中插入了大约 100 行数据。 Db.Select() 的时间大约需要 1 分钟。当我将数据库更改为mysql时,它立即返回结果。我还尝试使用另一个GUI软件访问sqlite数据库,并尝试执行一些sql语句,它们都工作正常。有人知道吗?

更新代码:

static void Main(string[] args)
    {
        string dbName = "testdb.sqlite";
        var path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        if (!System.IO.File.Exists(path + "/" + dbName))
        { 
            System.IO.File.Create(path + "/" + dbName).Dispose();
        }
        var dbFacory = new OrmLiteConnectionFactory("Data Source=./testdb.sqlite;Version=3;UTF8Encoding=True;", SqliteDialect.Provider);
        //var dbFacory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);
        var db = dbFacory.OpenDbConnection();
        db.DropAndCreateTable<TestTable>();
        db.DropAndCreateTable<BasicPersonnelInfo>();

        Console.WriteLine("Starts at : {0}", DateTime.Now.Second);
        for (int i = 0; i < 100; i++)
        {
            db.Insert<TestTable>(new TestTable { TestField = i.ToString()});
            db.Insert<BasicPersonnelInfo>(new BasicPersonnelInfo { Test3 = i.ToString()});
        }
        Console.WriteLine("Inserting Completed;");
        Console.WriteLine("Select at : {0}", DateTime.Now.Second);
        db.Select<BasicPersonnelInfo>();
        Console.WriteLine("Ends   at : {0}", DateTime.Now.Second);
        Console.WriteLine("Prese anykey to quit!");
        Console.ReadKey();
    }

最佳答案

如果您将 SQLite 保存到磁盘,由于文件权限,我发现运行时间非常长,如果您在 ASP.NET 中运行,您的 SQLite 数据库应该保存在 ~/App_Data 文件夹,并应授予 IIS_USR 用户帐户的写入权限。

为了提供一些关于预计需要的时间的信息,我添加了 Simple Insert/Select Benchmark在内存中的 SQLite 中插入并选择包含 20 个字符串列的表中的 100 行:

var dbFactory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider);
using (var db = dbFactory.Open())
{
    db.DropAndCreateTable<TableWithStrings>();

    var sw = Stopwatch.StartNew();
    for (int i = 0; i < 100; i++)
    {
        var row = TableWithStrings.Create(i);
        db.Insert(row);
    }
    "[:memory:] Time to INSERT 100 rows: {0}ms".Print(sw.ElapsedMilliseconds);

    sw = Stopwatch.StartNew();
    var rows = db.Select<TableWithStrings>();
    "[:memory:] Time to SELECT {0} rows: {1}ms".Print(rows.Count, sw.ElapsedMilliseconds);
}

和 SQLite 文件数据库:

var dbPath = "~/App_Data/db.sqlite".MapProjectPath();
var dbFactory = new OrmLiteConnectionFactory(dbPath, SqliteDialect.Provider);
using (var db = dbFactory.Open())
{
    db.DropAndCreateTable<TableWithStrings>();

    var sw = Stopwatch.StartNew();
    for (int i = 0; i < 100; i++)
    {
        var row = TableWithStrings.Create(i);
        db.Insert(row);
    }
    "[db.sqlite] Time to INSERT 100 rows: {0}ms".Print(sw.ElapsedMilliseconds);

    sw = Stopwatch.StartNew();
    var rows = db.Select<TableWithStrings>();
    "[db.sqlite] Time to SELECT {0} rows: {1}ms".Print(rows.Count, sw.ElapsedMilliseconds);
}

在我的 2013 Macbook Pro 工作站(有 4 个 VS 实例和多个 RDBMS 在后台运行)上的 VS.NET 2015 中将其作为 R# NUnit 测试运行,结果如下:

[:memory:] Time to INSERT 100 rows: 10ms
[:memory:] Time to SELECT 100 rows: 1ms

对于 SQLite 文件数据库:

[db.sqlite] Time to INSERT 100 rows: 659ms
[db.sqlite] Time to SELECT 100 rows: 13ms

虽然这不是一个合适的基准(即没有预热,不在控制台应用程序中进行更多迭代),但它应该提供一些有关预期结果的指示。注意 OrmLite 测试使用 ServiceStack.OrmLite.Sqlite.Mono OrmLite SQLite 版本。

关于c# - 用于 sqlite 的 ServiceStack.Ormlite 运行时间非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38735235/

相关文章:

c# - 像 mongdbo objectid 一样进行字节打包

C#/ASP.NET Selenium WebDriver - 重复使用 Cookie

mysql - sql计算多行类里面的当前学生

java - 插入数据库时​​出错 - 空字段

sql - 如何在 SQLite 数据库中重新播种自动增量列?

sqlite - 运行 ServiceStack 示例时出现 System.BadImageFormatException。

c# - Bing map 运行时错误 Windows 8.1

c# - 使用正则表达式从字符串中提取多个值

c# - ServiceStack - FluentValidation

redis - 不存在 key 的 ServiceStack Redis 客户端行为