我在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();
}
答案 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版本。