de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Lux782
Lux782
Вопрос

SQLite/C# Пулинг подключений и путаница с подготовленными заявлениями

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

Моя путаница связана с подготовленными операторами и пулом соединений.

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

Теперь, чтобы улучшить мои запросы и вставки, я прочитал об использовании подготовленных операторов. https://stackoverflow.com/questions/1703203/in-sqlite-do-prepared-statements-really-improve-performance и http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html оба указали, что при выполнении запроса, который будет выполняться несколько раз, подготовленные операторы - это то, что нужно. Я также читал, что подготовленный оператор специфичен для соединения и что после закрытия соединения подготовленный оператор теряется.

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

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

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

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

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

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

32 2012-05-22T14:11:45+00:00 2
Valeriu
Valeriu 52848
Редактировал вопрос 10-го октября 2021 в 12:27
 Community
Community
Редактировал вопрос 23-го мая 2017 в 12:00
SQLite, ADO.NET, Prepared Statements, Transactions and Enterprise Manager
Blog, Peter Bromberg
petesbloggerama.blogspot.com
Программирование
sqlite
c#
connection-pooling
prepared-statement
Востребованные видео
ПИШЕМ ПРИЛОЖЕНИЕ СПИСОК ДЕЛ НА C# WPF ОТ НАЧАЛА ДО КОНЦА | DATAGRID | JSON ПАРСИНГ РАБОТА С ФАЙЛАМИ
ПИШЕМ ПРИЛОЖЕНИЕ СПИСОК ДЕЛ НА C# WPF ОТ НАЧАЛА ДО КОНЦА | DATAGRID | JSON ПАРСИНГ РАБОТА С ФАЙЛАМИ
2 года назад
Уроки C# – Пишем умный ланчер – C#
Уроки C# – Пишем умный ланчер – C#
3 года назад
Уроки C# – Читаем данные из командной строки и PowerShell + в реальном времени – C#
Уроки C# – Читаем данные из командной строки и PowerShell + в реальном времени – C#
3 года назад
SQLite3 - Урок 1. Установка и Основные команды для работы с базой данных
SQLite3 - Урок 1. Установка и Основные команды для работы с базой данных
1 год назад
C# : Использование базы данных SQLite в приложении. Простейший пример
C# : Использование базы данных SQLite в приложении. Простейший пример
4 года назад
c# - это просто: Entity Framework Code First SqLite за 15 минут
c# - это просто: Entity Framework Code First SqLite за 15 минут
1 год назад
Изучение C# WPF на практике / Урок #5 – Создание базы данных SQLite
Изучение C# WPF на практике / Урок #5 – Создание базы данных SQLite
1 год назад
Connect C# Application to SQLite Database and interact with it
Connect C# Application to SQLite Database and interact with it
5 лет назад
Парни-хакатонщики: Сергей Гречишников и Александр "Батюшка Ленин". Kotlin, JS, TS, C#, C++
Парни-хакатонщики: Сергей Гречишников и Александр "Батюшка Ленин". Kotlin, JS, TS, C#, C++
6 месяцев назад
Programming in Visual C# - How to Connect C# .NET with SQLite Database
Programming in Visual C# - How to Connect C# .NET with SQLite Database
2 года назад
Исключения (Exception) в C# - Учим Шарп #14
Исключения (Exception) в C# - Учим Шарп #14
3 года назад
Наблюдатель. Паттерны проектирования C#
Наблюдатель. Паттерны проектирования C#
1 год назад
C# Connect to SQLite Database
C# Connect to SQLite Database
5 лет назад
Программирование на платформе UWP. Урок 17. SQLite и Entity Framework
Программирование на платформе UWP. Урок 17. SQLite и Entity Framework
5 лет назад
Подключение SQLite к проекту Unity
Подключение SQLite к проекту Unity
2 года назад
« Назад
Вперёд »
Serge Belov
Serge Belov
22-го ноября 2012 в 2:30
2012-11-22T02:30:18+00:00
Дополнительно
Источник
Редактировать
#16249715

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

Возможные причины для использования пула соединений

Пул соединений полезен, когда соединения дороги, например:

  • Для установления соединения требуется значительное время (сетевые соединения с SQL Server или Oracle DB) и полезно "кэшировать" открытые соединения в попытке повысить производительность системы.
  • Соединения ограничены и разделяются внутри приложения (соединения от веб-приложения, обслуживающего несколько одновременных запросов) или между приложениями, поэтому их необходимо освободить как можно быстрее, чтобы позволить другим клиентам продолжить работу.

Возможные причины для использования подготовленных заявлений

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

**SQLite: Что лучше выбрать?

Ответ зависит от требований вашего приложения. Лично я не уверен, что пул соединений SQLite - это обязательно хороший выбор. Если ваше приложение однопоточное, возможно, лучше использовать одно постоянное соединение с БД SQLite, что может быть намного быстрее, чем объединение соединений, и позволит вам использовать подготовленные операторы. Это отличается от SQL Server, где объединение соединений в пул является вполне разумным выбором по умолчанию.

Если производительность имеет значение, вам определенно следует профилировать приложение, чтобы понять, выгодно ли объединение соединений SQLite для вашего сценария.

Специфические вопросы

Большинство ответов связано с текущим провайдером System.Data.SQLite источник.

Если я открываю и закрываю свое соединение (что может означать или не означать. соединение закрывается из-за пула потоков), то насколько сильно пользы я действительно получаю от подготовленного оператора?

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

Однако я не думаю, что получу выгоду от сохранения одного объекта в транзакции. объекта в транзакции, потому что как только я закрываю соединение. подготовленный отчет, который был сгенерирован из первого объекта, теперь > потерян. потерян. Верно ли это утверждение?

Это верное утверждение.

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

Да, вам нужно хранить его. В SQLiteCommand хранится ссылка на подготовленный оператор.

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

Я не думаю, что это поддерживается.

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

Если вы измените соединение SQLiteCommand'а, оператор будет "заново подготовлен".

Valeriu
Valeriu 52848
Редактировал ответ 10-го октября 2021 в 12:27
System.Data.SQLite: Top-level Files of trunk
system.data.sqlite.org
15
0
Mohamed Arabi
Mohamed Arabi
18-го июня 2012 в 1:36
2012-06-18T13:36:29+00:00
Дополнительно
Источник
Редактировать
#16249714

Я не уловил, в чем именно заключается основная проблема, но если проблема в том, как вставить большое количество операторов вставки в одну транзакцию за столь короткое время.

Вот класс-помощник, который я нашел ранее, который может вам помочь:

SQLiteBulkInsertHelper.cs

Вы можете использовать его следующим образом:

SQLiteBulkInsertHelper ContactBlk = new SQLiteBulkInsertHelper("<SQLiteConnection>","<Table Name>");
ContactBlk.AllowBulkInsert = true;
ContactBlk.AddParameter("<Column Name>", /*Column Data Type*/System.Data.DbType.Int64);
ContactBlk.AddParameter("<Column Name>", /*Column Data Type*/System.Data.DbType.String);
ContactBlk.Insert(new object[] {<First Column Value>,<Second Column Value>});
ContactBlk.Flush();

Попробуйте, если вы видите в нем решение своей проблемы.

Valeriu
Valeriu 52848
Редактировал ответ 10-го октября 2021 в 12:27
Shadow  The Princess Wizard
Shadow The Princess Wizard
Редактировал ответ 18-го июня 2012 в 3:07
SQLiteBulkInsertHelper.cs - Google Drive
docs.google.com
0
0
Похожие сообщества 10
ExtremeCode чат
ExtremeCode чат
6 224 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode Курилка (флуд здесь): @extremecode_rest
Открыть telegram
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
3 481 пользователей
Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.
Открыть telegram
Microsoft Stack Jobs
Microsoft Stack Jobs
2 460 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 376 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
sql_ninja
sql_ninja
2 289 пользователей
Канал для тех, кто знает или интересуется SQL 🛢 Взаимная помощь и позитив =) Вакансии тут - @sql_jobs ! Бан за: оскорбления, спам, рекламу, расизм, сексизм. Наш MSSQL канал - @sqlcom У нас есть викторина по mssql, наберите в привате c @Gopnegbot /quiz и
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 780 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 21 час назад
2
Hideo Nakagawa
Зарегистрирован 1 день назад
3
Sergiy Tytarenko
Зарегистрирован 3 дня назад
4
shoxrux azadov
Зарегистрирован 5 дней назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
KO
RU
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией