Это нормально, чтобы оставить соединение sql открытым? - PullRequest
4 голосов
/ 16 августа 2011

Я непрерывно получаю данные через com-порт и выполняю некоторую расшифровку. Когда декодирование завершено, я должен сохранить результаты в базе данных SQL. Я думаю, так как декодирование выполняется (в цикле while, всегда работающем) десятки раз в секунду, и данные должны храниться в базе данных десятки раз в секунду, если разумно открыть и закрыть соединение с сервером sql в каждый цикл while или просто оставьте его открытым и продолжайте записывать данные в базу данных. Прежде всего это возможно? Во-вторых, если соединение остается открытым, могут ли сторонние приложения или компьютер одновременно обращаться к базе данных и считывать данные, когда моя программа хранит данные?

Ответы [ 4 ]

8 голосов
/ 16 августа 2011

База данных поддерживает более одного одновременного соединения, поэтому да, в этом сценарии вполне возможно оставить соединение с БД открытым - вы заблокируете другие, только если у вас есть длительный запрос, который приводит к блокировке строки / таблицы. Просто закройте соединение, когда закончите.

Также учтите, что большинство БД (т. Е. SQL Server) используют пул соединений для внутреннего использования, поэтому, даже если вы закрываете соединение с БД, оно просто возвращается в пул и не закрывается физически - пул управляет физические соединения с БД - это приводит к гораздо лучшей производительности, поэтому влияние открытия / закрытия соединений быстро уменьшается.

С MSDN :

Пул соединений уменьшает количество раз, когда новые соединения должен быть открыт. Пулер поддерживает право собственности на физическое подключение. Он управляет связями, поддерживая набор активных соединения для каждой данной конфигурации соединения. Всякий раз, когда пользователь звонки открыты по соединению, пулер ищет доступное соединение в бассейне. Если доступно объединенное соединение, оно возвращает его вызывающей стороне вместо открытия нового соединения. Когда приложение вызывает Close на соединение, диспетчер возвращает его объединенный набор активных соединений вместо его закрытия. Однажды соединение возвращается в пул, оно готово для повторного использования на следующий открытый звонок.

3 голосов
/ 16 августа 2011

Я бы открывал соединение, проходил через цикл столько раз, сколько необходимо, а затем закрывал соединение. Открытие и закрытие очень дорого. Но, благодаря Митчу Уиту и Дэйву Марклу, я узнал, что пул соединений выполняется бесплатно в фоновом режиме с .NET, поэтому расходы должны амортизироваться по всем вашим запросам.

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

Если вы согласны с этим последним битом, я бы позаботился о том, чтобы пакет INSERT был выполнен в контексте транзакции, чтобы его можно было зафиксировать или откатить как одну единицу работы. Изоляция и безопасность резьбы будут иметь значение.

0 голосов
/ 11 мая 2013

На самом деле вы должны явно закрыть SqlConnection.Open ()

Из MSDN: «Примечание. Если SqlConnection выходит из области видимости, он не закрывается. Поэтому необходимо явно закрыть соединение, вызвав Close или Dispose.»

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.71).aspx

Ура!

0 голосов
/ 16 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...