У меня есть сервер tomcat, вызывающий хранимую процедуру из jsp. В хранимой процедуре у меня есть запрос, который заполняет временную таблицу данными. Затем эта временная таблица соединяется с другой таблицей через dblink, чтобы заполнить другую таблицу темп, используя подсказку - DRIVING_SITE
. Последняя временная таблица затем соединяется с другой таблицей в нашей базе данных, чтобы вернуть набор результатов в tomcat.Соединение с базой данных Соединение с таймером
Извините, но я не могу представить пример кода для всего этого, но проблема, с которой я столкнулась, - это то, что через некоторое время ссылка на базу данных не используется, первый запрос, сделанный с использованием ссылки ничего не будет делать и возвращать ошибку:
test.jsp caught exception, closing connection: ORA-02068: following severe error from DATABASE_LINK_NAME
ORA-03135: connection lost contact
Каждый последующий запрос сделанный на ссылку базы данных в течение 10 минут или около последнего вызова будет хорошо. Таблица temp может быть огромной или малой, количество запрошенных данных, похоже, не имеет значения, но первый вызов после простоя получит эту ошибку, вероятно, в 75% случаев. Кто-нибудь испытал эту проблему? Если да, есть ли какие-либо резолюции?
Запрос структурирована следующим образом:
INSERT INTO temp_table_2
WITH last_submissions AS (
SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */
bs.unique_id,
CASE WHEN COUNT(bs.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag,
MAX(trx.unique_id) last_submission
FROM (SELECT unique_id
FROM temp_table_1) oids,
[email protected]_LINK bs,
[email protected]_LINK trx
WHERE oids.unique_id = bs.unique_id
AND bs.non_unique_join_id = trx.non_unique_join_id
GROUP BY bs.unique_id),
something_relevant AS (
SELECT /*+ DRIVING_SITE(some_schema.some_table_2) */
last_value_of_something.unique_id,
last_value_of_something.some_flag,
mv.value_description status
FROM (
SELECT /*+ DRIVING_SITE(some_schema.some_table_1) */
ls.unique_id,
CASE WHEN COUNT(ls.unique_id) > 1 THEN 'Y' ELSE 'N' END some_flag,
MAX(prd.prd_some_id) last_submission
FROM last_submissions ls,
[email protected]_LINK trx,
[email protected]_LINK prd
WHERE ls.last_submission = trx.unique_id
AND trx.some_unique_id = prd.some_unique_id (+)
GROUP BY ls.unique_id) last_value_of_something,
[email protected]_LINK prd,
[email protected]_LINK cs,
[email protected]_LINK mv
WHERE last_value_of_something.last_submission = prd.prd_some_id (+)
AND prd.some_id = cs.some_id (+)
AND cs.status_code = mv.value (+)
AND mv.value_type (+) = 'SOME_INDICATOR_FOR_DISPLAY_VALUES')
SELECT ls.unique_id unique_id,
NVL(pr.status, trx.some_code) status,
CASE WHEN ls.some_flag = 'Y' OR pr.some_flag = 'Y' THEN 'Yes' ELSE 'No' END display_the_flag
FROM /*+ DRIVING_SITE(some_schema.some_table_1) */
last_submissions ls,
[email protected]_LINK trx,
something_relevant pr
WHERE ls.last_submission = trx.unique_id
AND ls.unique_id = pr.unique_id
Существует ли межсетевой экран между двумя базами данных, которые удаляют соединение после периода простоя? Похоже, это может быть через 10 минут. В любом случае звучит как сетевые проблемы, а не только Oracle. –