Как лучше организовать паралельное исполнение запросов
От: AlexNek  
Дата: 10.11.14 23:06
Оценка:
Пока раздумываем над следующей ситуацией:
есть приложение которое исполняет некоторые запросы паралельно (Для примера — обновление материального въюва и чтение/запись других данных).
Сейчас все запросы к базе оформляются в виде плагина, так так требуется поддержка и MS SQl и Oracle.
Доступ к выбранному плагину осуществляется через синглтон и набор интерфейсов.
Делать параметр синхронное/асинхронное выполнение для плагинов БД пока совсем не хочется, а нужны оба типа выполения. Пока есть идея, чтобы на стороне плагина все запросы выполнялись с ожиданием исполнения, как обычно. А в ситуациях когда требуется, просто исполнять запросы из нескольких потоков. В текущей версии сделано так
OracleConnection conn = new OracleConnection(oradb);
conn.Open();

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "запрос"; 
OracleDataReader dr = cmd.ExecuteReader();


И для каждого треда держится свой OracleConnection. При этом сказали, что Connection Pool работает весьма фигово, особенно если пароль изменяется. Так что для соединений был заведен еще отдельный треад который пытается держать соединения открытыми. Данные поступают от оборудования почти ежесекундно, и поэтому постоянно открывать и закрывать соединение получается накладно.
Но что то мне подобный принцип не очень нравится, для "универсального" решения не тянет вроде.

Про общие принципы есть ссылки
http://msdn.microsoft.com/en-us/library/gg415714.aspx
https://docs.oracle.com/cd/B28359_01/server.111/b28310/manproc006.htm#ADMIN11187
а вот конкретных рекомендаций не густо.

Чем можете из опыта поделится? Думаю, что отдельно для Оракла и отдельно для Микрософта, а после общее найдется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.