ServiceStack.Ormlite for sqlite,运行时间非常慢

时间:2016-08-03 05:39:00

标签: 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();
    }

1 个答案:

答案 0 :(得分:2)

如果你要将SQLite保存到磁盘,由于文件权限我已经看到很长的运行时间,如果你在ASP.NET中运行,你的SQLite数据库应该保存在~/App_Data文件夹中,并且应该被赋予IIS_USR用户帐户的写权限。

为了预测应该花费的预期时间我已经添加了一个Simple Insert/Select Benchmark,它在一个包含20个字符串列的表中插入并选择100行,用于内存中的SQLite:

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

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