У меня есть дистрибутивная архитектура DB, где данные хранятся в нескольких SQL-серверах.
как может я действительно выбирать/обновлять/удалять путем выполнения единого запроса. например, "выбор * от сотрудников" должен возвратить данные из всех баз данных, которые я имею.
Как может записать единый запрос, которые натыкаются на несколько SQL-серверов, и получает единственное объединенное представление к моему веб-серверу.
Примечание: Так как количество SQL-серверов может измениться в варьировавшиеся времена, таким образом, я ищу что-то еще, чем связанные запросы начиная с управления связанными запросами в масштабе (или вниз) являются большой болью
Для взаимодействия с различными базами данных/соединениями вам понадобится распределенная транзакция через TransactionScope; к счастью, на самом деле это легче , чем db-транзакции (хотя вам нужна ссылка на System. Transactions.dll):
using(TransactionScope tran = new TransactionScope()) {
// lots of code talking to different databases / connections
tran.Complete();
}
Кроме того, TransactionScope
естественным образом гнездится, и SqlConnection
присоединяется автоматически, что делает его действительно простым в использовании.
Используйте TransactionScope
.
Если вы открываете соединения с разными серверами в области действия, то транзакция будет отнесена к распределенной.
Пример:
using (TransactionScope scope = new TransactionScope())
{
conn1.Open(); //Open connection to db1
conn2.Open(); //Open connection to db2
// Don't forget to commit the transaction so it won't rollback
scope.Complete()
}
Нельзя делать то, что вам нужно, с одним запросом, если только вы не хотите вставить посредника какого-нибудь типа, например, экземпляр SQL Express, который будет посредником с другими серверами, возможно, используя SQL CLR. Но это грязно.
Было бы гораздо проще просто выдать кучу асинхронных запросов, а затем объединить ответы в один DataTable (или эквивалент), когда они поступят. С помощью нативных асинхронных вызовов в стиле ADO.NET все запросы могут выполняться параллельно. Разумеется, при считывании данных в один DataTable необходимо использовать блокировку.
.Лучшим решением здесь является использование виртуальной СУБД для объединения нескольких бэкендов в один видимый бэкенд - поэтому запрос направляется в виртуальную СУБД, которая затем перенаправляет его соответствующим образом к реальным хранилищам данных.
OpenLink Virtuoso - это один из вариантов. Virtuoso открывает соединения с любым источником данных, доступным через ODBC (включая JDBC, через мост ODBC-JDBC)
Ваши приложения, потребляющие данные, могут подключаться к Virtuoso через ODBC, JDBC, OLE-DB или ADO.NET по мере необходимости. Все удаленные связанные объекты (таблицы, виды, хранимые процедуры и т.д.) доступны через все механизмы доступа к данным.
Хотя вы можете достичь аналогичных результатов, используя другие методы, описанные здесь, они требуют от конечного пользователя знать все о внутренних структурах данных, а также оптимизировать запросы самостоятельно. В Virtuoso встроенный оптимизатор затрат будет переписывать запросы для получения максимально быстрых результатов, с минимально возможным сетевым трафиком, на основе виртуальной схемы, построенной при соединении удаленных объектов.
Отказ от ответственности: я работаю на OpenLink Software, но не получаю прямой выгоды от использования наших продуктов.
.