Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# sqlite的ServiceStack.Ormlite运行速度非常慢_C#_Sqlite_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Sqlite,servicestack" /> servicestack,C#,Sqlite,servicestack" />

C# sqlite的ServiceStack.Ormlite运行速度非常慢

C# sqlite的ServiceStack.Ormlite运行速度非常慢,c#,sqlite,servicestack,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 dbNam

我正在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();
    }
static void Main(字符串[]args)
{
string dbName=“testdb.sqlite”;
var path=System.IO.path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
如果(!System.IO.File.Exists(路径+“/”+dbName))
{ 
System.IO.File.Create(路径+“/”+dbName.Dispose();
}
var dbFacory=new或mliteconnectionfactory(“数据源=./testdb.sqlite;版本=3;UTF8Encoding=True;”,sqlitedialent.Provider);
//var dbFacory=new-OrmLiteConnectionFactory(“:memory:”,sqlitedianal.Provider);
var db=dbFacory.OpenDbConnection();
db.DropAndCreateTable();
db.DropAndCreateTable();
WriteLine(“开始于:{0}”,DateTime.Now.Second);
对于(int i=0;i<100;i++)
{
Insert(新的TestTable{TestField=i.ToString()});
Insert(新的BasicPersonnelInfo{Test3=i.ToString()});
}
Console.WriteLine(“插入完成;”);
WriteLine(“选择在:{0}”,DateTime.Now.Second);
db.Select();
WriteLine(“结束于:{0}”,DateTime.Now.Second);
控制台.WriteLine(“Prese anykey to quit!”);
Console.ReadKey();
}

如果您要将SQLite保存到磁盘,我看到由于文件权限,运行时间非常长,如果您在ASP.NET中运行,您的SQLite数据库应该保存在您的
~/App\u Data
文件夹中,并且应该被授予对
IIS\u USR
用户帐户的写入权限

为了提供预期时间的一些想法,我添加了一个函数,在一个包含20个字符串列的表中为内存中的两个SQLite插入和选择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文件数据库:

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

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

我正在将SQLite保存到磁盘。谢谢,我试过使用内存中的SQLite数据库。它仍然很慢(所花费的时间与我从内存中的SQLite数据库中进行选择所花费的时间大致相同),因此文件权限已被考虑在内。我不知道发生了什么。@gnaix在内存中使用SQLite插入100行肯定不应该在1分钟左右,如果您可以创建一个独立的问题副本并将其发布到github存储库,我可以看一下。我能帮你吗?谢谢。我创建了一个独立的项目,并尝试使用内存和磁盘数据库。内存中的插入语句在1秒内执行。磁盘数据库的插入语句执行约15秒。这两个数据库的selecting 100 row语句执行约5秒。我有大约20列字符串,但这是应该发生的吗?@mythz好吧,你不会相信的……但是在我切换到Mono-SQLite版本之后……它工作得非常好。即使为什么对我来说仍然是一个神话……我现在要接受你的答案。我标记了这个神话,并将在其他时间研究它。。。。
[:memory:] Time to INSERT 100 rows: 10ms
[:memory:] Time to SELECT 100 rows: 1ms
[db.sqlite] Time to INSERT 100 rows: 659ms
[db.sqlite] Time to SELECT 100 rows: 13ms