2011-02-10 2 views
9

Я работаю с Windows-Mobile and Windows-CE с помощью SqlCE, и я не знаю, что лучше делать.Закрыть или не закрыть соединение в базе данных

Чтобы открыть соединение, когда программа открыта, запустите любой запрос ... обновите ... удалите базу данных и закройте соединение после закрытия программы?

Или открыть соединение запустите любой запрос ... восстановить ... удалить базу данных и немедленно закрыть соединение?

ответ

13

Ницца. Ответы повсюду. Вот что я знаю по опыту и взаимодействую с командой SQL Compact:

  1. Закрытие соединения сбрасывает сделанные вами изменения, в противном случае двигатель ждет период флеша перед его выполнением. Рекомендуется закрыть соединение, когда вы закончите использовать его, чтобы убедиться, что ваши изменения действительно отправляются в магазин. Потеря мощности после записи и до сброса потеряет данные.
  2. Нет официального пула соединений, но открытие сперва соединение дорого (т. Е. Медленное), все остальные быстрые. Рекомендация, которую я получил от команды, - это фактически создать соединение, когда приложение запустится и просто оставит его открытым. Фактически вам не нужно его использовать, но при сохранении его открыта большая часть информации о подключении, так что последующие подключения к одному и тому же магазину бывают быстрыми.

Таким образом, ответ на самом деле является тем и другим.

Редактировать

Для тех, кто заинтересован, хороший пример того, как это работает, можно увидеть в OpenNETCF ORM library. По умолчанию библиотека создает соединение «обслуживание», которое остается открытым и используется для выполнения таких задач, как запросы схемы. Все другие операции с данными используют свое собственное соединение.Вам также необходимо настроить библиотеку для повторного использования одного соединения в течение всего срока службы магазина или для использования нового соединения каждый раз, когда он касается магазина. Perfomance и поведение всегда были лучшими во всех моих проектах, используя значение по умолчанию (именно поэтому я сделал его по умолчанию).

+0

Спасибо за информацию. Просто начал использовать вашу библиотеку ORM. :-) –

+0

У меня были проблемы с медленным временем соединения для MS Charts. Как вы рекомендовали, я открыл первое соединение и оставил его открытым. После этого все остальные соединения были открыты/закрыты соответствующим образом. Временной интервал без соединения оставлен открытым: 00: 00: 00.0477849 Небольшая задержка с перерисованием диаграммы. Временная зона с соединением слева открыта согласно рекомендации ctacke: 00: 00: 00.0007839 Диаграмма перерисовывается мгновенно. Brilliant! – peterincumbria

2

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

+2

Можете ли вы объяснить сказанное «нарушение безопасности»? SQL Compact размещен в процессе, поэтому нет «портов подключения». – ctacke

1

На однопользовательской платформе, такой как wince, нет никакого вреда в том, что соединение открыто, и вы можете получить лучшую производительность.

1

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

2

Здесь уже есть некоторые противоречивые ответы.

Если честно, я не уверен, что WinCE имеет дело с соединениями. Я не думаю, что есть ConnectionPool.

Но общий шаблон в .NET заключается в том, чтобы открывать соединения как можно короче. Это повышает надежность и предотвращает утечку ресурсов. Убедитесь, что вы знаете о шаблоне using (var conn = ...) { ... }.

Таким образом, я бы сказал: идите со своим вторым вариантом и продолжайте поддерживать связь дольше, если у вас действительно возникает проблема с производительностью, и если открытие соединения является причиной. Я не думаю, что это будет с SqlCE

3

Всегда держите соединение открытым на всю жизнь своего приложения для Windows Mobile. Открытие базы данных SQL Server Compact - дорогостоящая операция.

0

Если беспокоиться о потерянных данных, потому что вы не вызывая Close() часто, вы можете выполнить свой код в пределах транзакции, совершающие изменения на диск немедленно:

using (SqlCeTransaction transaction = this.connection.BeginTransaction()) 
{ 
    using (SqlCeCommand command = new SqlCeCommand(query, connection)) 
    { 
     command.Transaction = transaction; 
     command.ExecuteNonQuery(); 
    } 
    transaction.Commit(CommitMode.Immediate); 
} 

Конечно, есть еще некоторые характеристики теряются при использовании CommitMode.Immediate слишком часто.

Смежные вопросы