OrmLite(ServiceStack):仅使用临时数据库连接(使用'使用'?)

时间:2018-04-26 07:02:13

标签: mysql servicestack ormlite-servicestack datareader

在过去10多年的时间里,我总是打开数据库(mysql)的连接并保持打开状态,直到应用程序关闭。所有查询都在连接上执行。

现在,当我在Servicestack网页上看到示例时,我总是看到正在使用using - 块,例如:

using (var db = dbFactory.Open())
{
    if (db.CreateTableIfNotExists<Poco>())
    {
        db.Insert(new Poco { Id = 1, Name = "Seed Data"});
    }

    var result = db.SingleById<Poco>(1);
    result.PrintDump(); //= {Id: 1, Name:Seed Data}
}

在我目前的测试项目中,我让OrmLite以正常方式工作(一个db-connection,没有using-statements),所以我基本上有一个全班_db,像这样:

_dbFactory = new OrmLiteConnectionFactory($"Uid={dbAccount.Username};Password={dbAccount.Password};Server={dbAccount.Address};Port={dbAccount.Port};Database={dbAccount.Database}", MySqlDialect.Provider);

_db = _dbFactory.Open(); // var kept in memory, and used for all queries

它起初工作,但现在我突然得到了例外:

  

已经有一个与此Connection关联的开放DataReader,必须先关闭

有些代码可能会在这里和那里运行SELECT,如果我理解正确,如果同时发生SELECT和INSERT,会出现此错误吗?

如果是这样,最好是始终为每个查询打开一个 new 连接(例如,在using语句中)?不是一个很大的开销,为每个查询做什么?

1 个答案:

答案 0 :(得分:3)

拥有1个DB连接不是ThreadSafe,因此如果最多有1个线程访问数据库连接,那么保持连接只是一个选项。

大多数ADO.NET提供程序默认启用连接池,因此在完成连接后关闭连接会更有效,因为连接会返回到池中,这会减少正在使用的活动连接数。