2013-06-30 3 views
1

Мне было поручено реализовать приложение (на C++) для оценки ожидающих представлений (представление представляет собой алгоритм программирования для данной проблемы). Сайт (в ASP.NET MVC) публикует проблемы и позволяет пользователям отправлять свои ответы, а затем помещает представления как «ожидающие оценки» в базе данных (SQL Server 2008R2), и именно тогда начинается моя работа:Длинные соединения DB или соединения по требованию?

У меня будет 3 (или более) экземпляра моего приложения, работающего как службы. Каждый экземпляр должен проверить, существуют ли какие-либо ожидающие представления в БД каждые 2 секунды. Если он существует, я извлекаю и компилирую его, после успешной компиляции я его выполняю и, наконец, после выполнения, проверьте правильность ответа. Затем я обновляю это представление, устанавливая результаты и удаляя его из ожидающей таблицы. Мне нужно указать в БД текущий статус ожидающего представления (компиляция, выполнение, суждение).

Время для оценки представления - ~ (1-3) s, и тот же экземпляр никогда не оценивает больше одного представления одновременно.

Моя проблема: как подключиться к серверу БД? У меня есть 3 варианта решений, и мне нужно знать, что должно быть лучше (для повышения эффективности) и почему: 1 - Установите соединение с БД после создания экземпляра приложения и никогда не закрывайте его (закройте его, когда я удалю экземпляр или завершение работы сервера, что теоретически никогда не произойдет.) 2 - Откройте соединение каждые 2 с, чтобы получить ожидающее представление (если оно существует) дождитесь завершения полного процесса оценки, задает результаты оценки и затем закройте соединение. 3 - То же, что и 2, но закрытие соединения, когда я получаю представление, когда компиляция заканчивается, снова открывайте его и обновляйте состояние ожидающего отправки, закрывайте его, когда завершение выполнения, снова открывайте его и обновляете состояние ожидания отправки, закройте его , наконец, когда окончание оценки откроет его и задает результат оценки.

+0

По требованию из пула, если вы можете это сделать. Делает ваш код намного чистым. –

+0

Технически ваши связи должны быть долговечными по соображениям производительности. Тем не менее, это проблема уровня инфраструктуры, и ее следует обрабатывать пулом соединений. (Возможно, у ODBC есть один встроенный модуль, если я правильно прочитал документы: http://msdn.microsoft.com/en-us/library/ms716319.aspx). Сам код приложения должен поддерживать только соединение в течение длительного времени как это требуется для завершения транзакции. (В вашем случае один переход состояния представления.) – millimoose

ответ

1

Вы не говорите, какую библиотеку доступа к базе данных вы используете (ODBC, ado.net, другое?). Открытие и закрытие соединений с базой данных - относительно дорогостоящая операция. Вы должны использовать какую-то схему объединения соединений в своей инфраструктуре доступа к базе данных. Пул соединений открывается в течение определенного периода времени, и когда ваше приложение открывает соединение, ему будет передано уже открытое соединение из пула. Это сделает его более эффективным. Go читать около connection pooling для SQL Server

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