gpt4 book ai didi

sql - 数据库链接连接超时

转载 作者:行者123 更新时间:2023-11-28 22:43:18 26 4
gpt4 key购买 nike

我有一个从 jsp 调用存储过程的 tomcat 服务器。在存储过程中,我有一个用数据填充临时表的查询。然后该临时表通过 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 分钟左右内对数据库链接进行的每个后续查询都可以。临时表可大可小,查询的数据量似乎没有区别,但空闲时间后的第一次调用可能有 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,
some_schema.some_table_1@DATABASE_LINK bs,
some_schema.some_table_1@DATABASE_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,
some_schema.some_table_1@DATABASE_LINK trx,
some_schema.some_table_2@DATABASE_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,
some_schema.some_table_2@DATABASE_LINK prd,
some_schema.some_table_3@DATABASE_LINK cs,
some_schema.some_display_value_table@DATABASE_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,
some_schema.some_table_1@DATABASE_LINK trx,
something_relevant pr
WHERE ls.last_submission = trx.unique_id
AND ls.unique_id = pr.unique_id

最佳答案

您是否希望两个数据库服务器之间的网络稳定并允许连接存在一段时间?

当您使用数据库链接时,本地服务器会打开到远程服务器的连接。只要您的 session 打开以供其他查询使用,该连接就会保持打开状态。如果您看到连接断开,这通常意味着网络中有某些东西(通常是防火墙)正在检测并终止空闲连接。这也可能意味着两台服务器之间的网络不稳定。

理想情况下,您可以通过修复任何潜在的网络问题来解决问题。例如,如果有防火墙正在终止空闲连接,您应该能够修改防火墙配置以避免终止这些连接。

如果无法修复基础架构,您可以在每次查询后关闭与远程服务器的连接(或者至少在每次查询后可能会有很长的空闲时间)

ALTER SESSION CLOSE DATABASE LINK <<dblink name>>

然而,这意味着您可能会在每次查询时建立和断开与远程服务器的连接——这可能相对昂贵并且可能会给远程服务器带来更多负载(当然,取决于它发生的频率以及您可能有多少 session )。

通过数据库链接将数据提取到一系列临时表中以便为使用 Web 应用程序的人提供数据的整个过程也让我觉得这是一个潜在的问题架构。也许你有充分的理由这样做。但我会强烈考虑使用某种复制技术(物化 View 、Streams 或 GoldenGate 是内置选项),而不是在运行时通过数据库链接提取数据。

关于sql - 数据库链接连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com