OrmLite (ServiceStack): использовать только временные db-соединения (использовать 'using'?) - PullRequest
0 голосов
/ 26 апреля 2018

Последние 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}
}

В моем текущемtest-project, я заставил OrmLite работать в обычном режиме (одно db-соединение, без операторов using), поэтому у меня был класс _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

Itработал в начале, но теперь я неожиданно получил исключение:

Уже есть открытый DataReader, связанный с этим подключением, который должен быть закрыт первым

Возможно, какой-то код выполняетсяSELECT здесь и там, и если я правильно понимаю, если SELECT и INSERT произошли бы одновременно, появляется эта ошибка?

Если да, то лучше ли всегда открывать новое соединение для каждого отдельного запроса (скажем, внутри оператора использования)?Разве это не большие затраты, что делать для каждого запроса?

1 Ответ

0 голосов
/ 26 апреля 2018

Наличие соединения с 1 БД не является ThreadSafe, поэтому удержание соединения возможно только в том случае, если к БД подключено не более 1 потока.

Большинство провайдеров ADO.NET по умолчанию включают пул соединений, так что это большеЭффективно закрыть соединение, когда вы закончите с ним, так как соединение возвращается в пул, что уменьшает количество активных соединений в использовании.

...