Я проводил некоторое время, читая различные рекомендации для баз данных и специально для 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 в памяти и изменяю его параметры и соединение, когда я открываю и закрываю соединение для разных транзакций, я по существу сохраняю подготовленный оператор между различными соединениями?
Скорее всего, я думаю о мыслях на этом этапе, но надеюсь, что вы поможете мне лучше понять, как эти вещи взаимодействуют, чтобы я мог извлечь максимальную выгоду из них.