ServiceStack.Ormlite for sqlite运行时间非常慢 - c#

我在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,它在包含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版本。

JavaScript陷入了Selenium for Python的泥潭 - javascript

因此,当您向下滚动页面时,我想抓取一个使用JavaScript / AJAX生成其他结果的网站。我正在将Python 3.7与Selenium Chrome无头运行。但是,随着抓取的进行,您最终将获得数量不断增加的代码,这会使我的机器运行缓慢,直到停止为止。甚至简单的操作-code = driver.page_source –生长需要几秒钟。我运行了一个测试…

在Eclipse for EAR Project中添加外部jar文件 - java

我需要将外部jar文件添加到EAR项目。我确实添加了,但是jar文件没有反映在lib目录中,它显示在lib目录下面。我在右键单击Deployment Descriptor,Import-> Java EE Utility Jar并选择从文件夹中复制时添加了这些jar文件。当我将jar文件拖到lib目录中时,在eclipse项目资源管理器中,速度jar文…

IronPython for SWIG python接口 - c#

我有一个通过SWIG创建的python接口,作为一些3d派对C / C ++程序的包装。我可以通过C#使用它,没问题。我只是想知道IronPython是否可以使我的“集成生活”更加简单/无缝。任何反馈将不胜感激。非常感谢。 参考方案 IronPython无法使用SWIG生成的包装器。它确实支持ctypes来访问C / C ++,但这实际上取决于您的需求。如果…

如何使用Python for .NET正确嵌入 - c#

当我尝试使用PythonEngine.ImportModule(mymodulename) 尝试加载依赖项中的一些可选模块(不使用嵌入模块就不需要)。这导致此方法返回null,因为不需要这些可选依赖项中的某些,因此不可用。在此PythonNET API中,用于加载依赖于其他多个模块的用户编写的模块的正确方法是什么? 参考方案 看来我的问题只是导入不带扩展名(…

将TransactionScope隔离级别更改为内存DB中的快照 - c#

我正在使用基于内存的数据库(使用ServiceStack.OrmLite.Sqlite.Windows)在基于Servicestack的Web API中进行单元测试。我正在尝试测试的方法如下。public object Get(object request) { using (var db = HostContext.Resolve<IDbConnec…