Как можно закрыть Oracle DbLinks в JDBC с источниками данных XA и транзакциями, чтобы избежать ошибок ORA-02020? - PullRequest
4 голосов
/ 23 февраля 2011

У меня есть приложение на основе JDBC, которое использует источники данных XA и транзакции, которые охватывают несколько соединений, подключенных к базе данных Oracle.Приложению иногда необходимо выполнить несколько запросов, используя соединение с таблицей с другого (Oracle) сервера, используя общий DbLink.Запрос работает, если я не делаю это слишком часто, но после 4 или 5 запросов в быстрой последовательности я получаю ошибку (ORA-02020 - слишком много ссылок используется).Я провел некоторое исследование, и предлагаемое лекарство - назвать «ALTER SESSION CLOSE DATABASE LINK».Если я вызываю этот запрос после запроса, который присоединяется к таблице DbLnk, я получаю ошибку ORA-2080 (ссылка используется).Если я позвоню до запроса, я получу ORA-2081 (ссылка закрыта).Этот призыв приносит пользу?Соединение JDBC закрывается задолго до принятия транзакции (которое управляется сервлетом или контейнером EJB, в зависимости от обстоятельств).У меня складывается впечатление, что когда соединение закрывается, Oracle помечает ссылку как закрытую, но для возврата в пул доступных ссылок требуется минута или две.Я понимаю, что мог бы увеличить пул ссылок (используя свойство open_links в файле конфигурации), но это не гарантирует, что у меня не будет той же проблемы при более тяжелой нагрузке.Есть ли что-то, что я могу сделать по-другому, чтобы заставить dblinks закрываться быстрее?

1 Ответ

2 голосов
/ 25 февраля 2011

Любой распределенный SQL, даже выборка, откроет транзакцию, которая должна быть закрыта, прежде чем вы сможете закрыть ссылку на базу данных.Вам нужно откатиться или зафиксировать, прежде чем вызывать ALTER SESSION CLOSE DATABASE LINK.

Но, похоже, у вас уже есть что-то еще, обрабатывающее ваши транзакции.Если откат или фиксация вручную невозможны, попробуйте увеличить количество открытых ссылок.Параметр OPEN_LINKS - это максимальное количество ссылок за сеанс.Количество необходимых ссылок не зависит от нагрузки, оно должно основываться на максимальном количестве отдельных удаленных баз данных.

Редактировать:

СитуацияВы описываете в своем комментарии не должно произойти.Я недостаточно разбираюсь в вашей системе, чтобы понять, что на самом деле происходит с транзакциями.В любом случае, если вы не можете точно определить, что делает система, возможно, вы можете заменить «изменить ссылку на закрытие сеанса» на такую ​​процедуру:

create or replace procedure rollback_and_close_db_links authid current_user is
begin
    rollback;
    for links in (select db_link from v$dblink) loop
        execute immediate 'alter session close database link '||links.db_link;
    end loop;
end;
/

Возможно, вам понадобится этот грант:

grant select on v_$dblink to [relevant user];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...