Добрый день,
подскажите, как решить проблему. Имеется группа приложений, которые должны работать с БД (Oracle). Необходимо, чтобы соединение с БД создавалось в одном из них, и все остальные приложения использовали именно его для выполнения запросов к БД. Вопрос: каким образом (если вообще можно) передать ODAC connection (класс TOraSession) между приложениями, используя COM?
Аноним пишет:
> именно его для выполнения запросов к БД. Вопрос: каким образом (если > вообще можно) передать ODAC connection (класс TOraSession) между > приложениями, используя COM?
Это вопрос по OLE/COM, а не по СУДБ. Коннекцию из одного приложения
в другое передать ты не сможешь. Тебе придется передавать данные.
Как — вопрос OLE/COM.
Здравствуйте, <Аноним>, Вы писали:
А>подскажите, как решить проблему. Имеется группа приложений, которые должны работать с БД (Oracle). Необходимо, чтобы соединение с БД создавалось в одном из них, и все остальные приложения использовали именно его для выполнения запросов к БД. Вопрос: каким образом (если вообще можно) передать ODAC connection (класс TOraSession) между приложениями, используя COM?
Для MSSQL существует возможность присоединиться из одного соединения к транзакции другого с помощью sp_getbindtoken/sp_bindsession. Возможно, подобный механизм присутствует и в Oracle.
Здравствуйте, Аноним, Вы писали:
А>Добрый день, А>подскажите, как решить проблему. Имеется группа приложений, которые должны работать с БД (Oracle). Необходимо, чтобы соединение с БД создавалось в одном из них, и все остальные приложения использовали именно его для выполнения запросов к БД. Вопрос: каким образом (если вообще можно) передать ODAC connection (класс TOraSession) между приложениями, используя COM?
передавать можно например COM класс (точнее передавать ссылку), содержащий в себе нужный вам объект. Но не рекмендую так как обмен данными между процессами, да потоками одного процесса может быть "тяжелым" (COM маршалинг). Кроме того вам придется повозится с многопоточностью, что при недостатке может приводить к "странным" ошибкам и повисаниям приложений.
как вариант предложил бы реализовать одно приложение с доступом БД, другие ображаются к этому приложению за данным оформленными как нормальные классы или что-то в этом духе. то есть общим сделать не соединение с БД, а нормальный слой доступа.
Здравствуйте, MasterZiv, Вы писали:
MZ>Это вопрос по OLE/COM, а не по СУДБ. Коннекцию из одного приложения MZ>в другое передать ты не сможешь. Тебе придется передавать данные. MZ>Как — вопрос OLE/COM.
Вы не правы. Хоть вопрос и затрагиват вопрос использования COM, но отношение к СУБД он имеет самое прямое. Я не спрашиваю как передавать данные в COM — это мне давно известно, меня интересует другое, как передать сесcиию (коннект к БД) из одного предложения в другое в ODAC. ADO, к примеру, позволяет это делать, там есть специализированный интерфейс который можно передовать между приложениями и использовать тем самым лишь одно соединение с БД. По ряду причин ADO использовать не могу.
Здравствуйте, Lloyd, Вы писали:
L>Для MSSQL существует возможность присоединиться из одного соединения к транзакции другого с помощью sp_getbindtoken/sp_bindsession. Возможно, подобный механизм присутствует и в Oracle.
Пожалуйста, опишите чуть подробнее где и когда параметры sp_getbindtoken/sp_bindsession используются?
Здравствуйте, shelkovnikov, Вы писали:
S>передавать можно например COM класс (точнее передавать ссылку), содержащий в себе нужный вам объект. Но не рекмендую так как обмен данными между процессами, да потоками одного процесса может быть "тяжелым" (COM маршалинг). Кроме того вам придется повозится с многопоточностью, что при недостатке может приводить к "странным" ошибкам и повисаниям приложений.
S>как вариант предложил бы реализовать одно приложение с доступом БД, другие ображаются к этому приложению за данным оформленными как нормальные классы или что-то в этом духе. то есть общим сделать не соединение с БД, а нормальный слой доступа.
Спасибо за ответ. COM технология в моё проекте необходима как воздух, и маршалинг не так страшен как Вы его описываете . Тот вариант, что Вы предлагаете, называется "трёхзвенкой", когда "тонкие" клиенты не работают с СУБД напрямую, а используют для этого отдельное приложение — сервер обработки данных (который и устанавливает связь с СУБД). Этот вариант действительно можно использовать для решения моей задачи, но хотелось бы всё же по другому.
Хороший пример ADO — оно позволяет получить интерфейс connection'а к СУБД. Именно его и передают между процессами через COM. В этом случае клиенты получая его могут обратиться к СУБД уже через существующее соединение, не создавая новое.
Здравствуйте, RSDN-SM, Вы писали:
L>>Для MSSQL существует возможность присоединиться из одного соединения к транзакции другого с помощью sp_getbindtoken/sp_bindsession. Возможно, подобный механизм присутствует и в Oracle.
RS>Пожалуйста, опишите чуть подробнее где и когда параметры sp_getbindtoken/sp_bindsession используются?
параметры sp_getbindtoken/sp_bindsession используются при вызове процедур sp_getbindtoken/sp_bindsession.
Здравствуйте, RSDN-SM, Вы писали:
RS>Здравствуйте, shelkovnikov, Вы писали:
S>>передавать можно например COM класс (точнее передавать ссылку), содержащий в себе нужный вам объект. Но не рекмендую так как обмен данными между процессами, да потоками одного процесса может быть "тяжелым" (COM маршалинг). Кроме того вам придется повозится с многопоточностью, что при недостатке может приводить к "странным" ошибкам и повисаниям приложений.
S>>как вариант предложил бы реализовать одно приложение с доступом БД, другие ображаются к этому приложению за данным оформленными как нормальные классы или что-то в этом духе. то есть общим сделать не соединение с БД, а нормальный слой доступа.
RS>Спасибо за ответ. COM технология в моё проекте необходима как воздух, и маршалинг не так страшен как Вы его описываете . Тот вариант, что Вы предлагаете, называется "трёхзвенкой", когда "тонкие" клиенты не работают с СУБД напрямую, а используют для этого отдельное приложение — сервер обработки данных (который и устанавливает связь с СУБД). Этот вариант действительно можно использовать для решения моей задачи, но хотелось бы всё же по другому.
RS>Хороший пример ADO — оно позволяет получить интерфейс connection'а к СУБД. Именно его и передают между процессами через COM. В этом случае клиенты получая его могут обратиться к СУБД уже через существующее соединение, не создавая новое.
тогда создайте свой COM класс как описано в начале моего ответа, и передавайте ссылку на реализованный им интерфейс. одним из свйств класса пусть будет TOraSession (возможно ли это не скажу, так как не приходлось работать с oracle)
Re[4]: ODAC и COM
От:
Аноним
Дата:
25.12.06 06:43
Оценка:
Здравствуйте, shelkovnikov, Вы писали:
S>одним из свйств класса пусть будет TOraSession (возможно ли это не скажу, так как не приходлось работать с oracle)
К сожалению, просто TOraSession в COM передать нельзя. Можно только описать интерфейс с неким набором свойств. Тех свойств которые доступны у TOraSession по чтению-записи, не достаточно для передачи их клиенту и организации там того же самого подключения. Придётся использовать комбинировано ADO/ODAC.