У меня есть файл с разделителями, который я использую для вставки/обновления записей в таблице sql-сервера с помощью приложения .net. Файл имеет около 80000 записей и обрабатывается ежедневно. Мой вопрос: безопасно или даже разумно держать соединение с db открытым, пока я прокручиваю каждую из строк 80000 или я должен закрывать соединение и снова открываться с каждой итерацией петли? Это звучит громоздко само по себе. Тем не менее, я обеспокоен тем, что долгое время поддерживаю открытое соединение, удерживая блокировки и ненужно используя память. Что было бы более масштабируемым, безопасным и разумным способом сделать это?длительные операции с базой данных в .net
ответ
Во-первых, нет, вы не должны открывать/закрывать соединение в каждой строке. Для 80 000 строк это займет вечность и просто добавит дополнительные накладные расходы. Вы можете рассмотреть возможность группировки строк (сбросьте соединение, скажем, каждые 10-500 строк). К счастью, есть лучший вариант:
Во-вторых, правильный способ вставки/обновления многих строк в базе данных из приложения .Net заключается в использовании команд SQLBulkCopy methods, а не команд INSERT или UPDATE. Вы должны использовать SQLBulkCopy для загрузки строк данных в таблицу холдинга/промежуточной таблицы, а затем использовать хранимую процедуру SQL для вставки/обновления в фактическую таблицу (таблицы), en-mass.
Если вас беспокоит постоянная нагрузка SQLBulkCopy, он имеет встроенные параметры пакетной обработки.
Используя эту технику, начальная загрузка данных должна быть не менее 5 раз быстрее, а фактическая таблица Вставка/Обновления должна составлять всего несколько секунд.
У меня когда-то была необходимость импортировать данные. Но я должен был запустить некоторые мини-бизнес-правила. Кроме того, в моем требовании было импортировать как можно больше строк, но если что-то не удалось, запишите его (но не пропустите весь импорт).
Я написал образец ниже.
я пройти вниз N число записей (N = 1000), например, как ~ XML в хранимой процедуре.
N следует настраивать, чтобы найти «сладкое пятно». Но один за раз слишком медленный, и 80 000 в свое время, похоже, многим. 1000 (ряды) x 80 "работает" .... является хорошей отправной точкой, ИМХО.
Так что, если ваш импорт «тупой», то предложенный ранее «SQLBulkCopy» может быть лучшим способом. Но если у вас есть какие-либо проверки или проверки, то мой пример может быть хорошим предложением.
.......
Другой вариант:
http://msdn.microsoft.com/en-us/library/ms162802.aspx Bcp.exe
Но это на самом деле не "точка чистый код".
Так что это был пример VS2005. Человек, я старею! Если бы я сделал это сегодня, я бы это сделал. (1) Используйте VS2010 (по крайней мере). (2) Измените EnterpriseLibrary v5, у которого уже есть OleDb abilties из коробки и (3) Измените мой TSQL, чтобы не использовать OPENXML, а скорее синтаксис «узлы». Пример здесь: http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html – granadaCoder
- 1. Многопоточные потенциально длительные операции
- 2. Уточнить длительные операции Linq?
- 3. Асинхронные операции с базой данных Oracle с использованием C#, .NET?
- 4. В MVVM, где выполняются длительные бизнес-операции?
- 5. Операции с базой данных в транзакции ejb
- 6. Операции с базой данных в Android
- 7. Операции с базой данных с помощью Robotium
- 8. Длительные операции в службе MVC и WCF
- 9. Операции с базой данных и отдельные запросы
- 10. JOOQ-Как обобщать операции с базой данных
- 11. Закрытие оператора после операции с базой данных?
- 12. рельсам операции с базой данных выполняется дважды
- 13. Используйте обещание ждать операции с базой данных
- 14. jUnit test Операции с базой данных
- 15. Длительные операции в инициализации фасоли фанеры
- 16. Threadpool, порядок выполнения и длительные операции
- 17. Длительные операции (потоки) в среде web (asp.net)
- 18. Можно ли выполнять длительные операции в ChannelInboundHandler.channelRead
- 19. Отметить все потоки, ожидающие на длительные операции
- 20. Как эффективно обрабатывать операции с последовательной базой данных по WAN
- 21. Как подключиться .NET с базой данных sql?
- 22. .net веб-сайт с базой данных mysql
- 23. .Net Application Installation 2012 с базой данных
- 24. Операции с базами данных в архитектуре ядра AngularJS/.NET
- 25. Как обрабатывать длительные операции с платформой Entity Framework?
- 26. Как обновить список после операции с базой данных в AngularJS
- 27. Получить статус операции с базой данных в крюке «после удаления»
- 28. RabbitMqTemplate операции приема в распределенной транзакции с базой данных
- 29. Как выполнять операции с базой данных с помощью Async Task
- 30. Операции с базой данных на Hashmap с использованием пружины JDBC
Пожалуйста, определите 'в течение длительного времени': часов? Это работает внутри одной транзакции? О каких замках вы имеете в виду? Где вы используете память, в sql или на сервере приложений? Я не осмеливаюсь попросить детально рассказать о более масштабируемых и безопасных ... – rene
В настоящее время с образцом, который я тестирую, требуется всего около часа. Но если фактический файл растет, когда я перехожу к его производству, он будет длиннее. Я не использую одну транзакцию. –
Является ли ваш sqlserver максимальным? Может ли он справиться с одним дополнительным работником? Означает ли порядок? – rene