Объединение пулов соединений SQLite/C# и путаница с подготовленными операторами

Я провел некоторое время за чтением различных передовых практик для баз данных и, в частности, для SQLite. Во время чтения я обнаружил, что делаю много вещей, которые не должен делать, и при попытке исправить эти проблемы я запутался, думая о некоторых более тонких деталях использования SQLite с его реализацией ADO.

Мое замешательство связано именно с подготовленными операторами и объединением соединений.

При чтении http://msdn.microsoft.com/en-us/library/ms971481.aspxя обнаружил, что соединения следует открывать только для транзакции. После завершения транзакции соединение должно быть закрыто. У меня нет четкого понимания, почему это так, но я исходил из предположения, что автор(ы) знают лучше, чем я. Я понимаю, что когда соединение закрыто, это не означает, что оно на самом деле был закрыт. Это просто означает, что он был возвращен в пул.

Теперь, чтобы улучшить свои запросы и вставки, я прочитал об использовании подготовленных операторов. Действительно ли в SQLite подготовленные операторы повышают производительность? и http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.htmlчто при выполнении запроса, который будет выполняться несколько раз, лучше всего использовать подготовленные операторы.Я также читал, что подготовленный оператор специфичен для соединения и что после закрытия соединения подготовленный оператор теряется.

Вот что меня смущает. Если я открываю и закрываю свое соединение (что может означать или не означать, что соединение закрывается из-за пула потоков), то какую пользу я действительно получаю от подготовленного оператора? Я могу понять, что если у меня есть 1000 объектов, которые мне нужно сохранить в одной транзакции, подготовленный оператор может очень помочь. Однако я не верю, что увижу выгоду от сохранения одного объекта в транзакции, потому что как только я закрываю соединение, подготовленный оператор, сгенерированный из первого объекта, теперь теряется. Это верное утверждение?

Мое замешательство усугубляется тем фактом, что я считаю, что подготовленный оператор связан с областью действия моего объекта SQLiteCommand.

Если я создаю SQLiteCommand, представляющий запрос, который я буду часто выполнять, нужно ли мне хранить этот SQLiteCommand в памяти, чтобы подготовленный оператор оставался активным?

Если я создаю новую команду SQLiteCommand с тем же оператором SQLite, признается ли она, что новая команда SQLiteCommand такая же, как и предыдущая, и, таким образом, содержит подготовленный оператор, который можно использовать?

Если я сохраняю SQLiteCommand в памяти и изменяю его параметры и соединение, когда я открываю и закрываю соединение для разных транзакций, сохраняю ли я по существу подготовленный оператор активным между различными соединениями?

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

32
задан Community 23 May 2017 в 12:00
поделиться