如何防止Oracle SQL Developer关闭数据库连接?

43

有没有办法让Oracle SQL Developer不要关闭我的数据库连接,或者增加超时时间?有时在长时间运行的查询期间,SQL Dev会突然关闭连接,导致我在服务器上运行的查询仍在进行,但却无法获得结果。如果我通过RDP远程登录服务器并在本地运行SQL Dev,则似乎从未出现此问题。


SQL Developer 4 相关问题及解决方案:https://dev59.com/AWcs5IYBdhLWcg3wRBxQ - Vadzim
7个回答

33

答案

最有可能的原因是SQL Developer和数据库之间的防火墙导致连接中断。您可以通过使用SQL Developer Keepalive插件在SQL Developer中解决此问题。

您还可以通过使用ThomasDavid Mann提供的答案从数据库服务器中修复此问题。

Oracle Net可以配置死连接检测(SQLNET.EXPIRE_TIME)以解决此问题。在数据库服务器上将EXPIRE_TIME设置为小于防火墙连接超时的值,以使DCD保持对数据库的连接处于活动状态。请参见注意事项151972.1“死连接检测(DCD)解释”

原始答案

我没有这个问题的答案,但我也遇到了同样的问题。

我的SQL Developer和数据库之间的防火墙会自动关闭“非活动”会话。根据防火墙的定义,长时间运行的查询是非活动会话,因此它会关闭它。我尚未找到如何使SQL Developer通过具有长时间运行的查询的连接发送数据包,以便防火墙不会关闭连接。我不知道这是否可能。

因此,我认为这不是SQL Developer的问题,而是防火墙问题。

-- 更新

有一个扩展可以让您保持连接处于活动状态:http://sites.google.com/site/keepaliveext/

它还没有完全完成(例如,您收到的通知无论指定什么超时时间都会显示相同的超时时间),但它确实可以解决问题。我尚未测试它是否与最新的SQL Developer预发布版本兼容,但它适用于SQL Developer 2.2.x

-- 更新

对于SQL Developer 4+,您可以使用:http://scristalli.github.io/SQL-Developer-4-keepalive/


我测试了保持连接扩展。http://sites.google.com/site/keepaliveext/它的工作效果完全符合预期,谢谢! - Frederic Conrotte
3
SQL Developer 4.0 的可用版本:https://bitbucket.org/scristalli/sql-developer-4-keepalive/overview - Ngoc Pham

13

这里有另一个保持连接活跃的扩展程序,可能会有用。(上面提到的扩展程序存在一些问题,在这个扩展程序中已经得到解决。)

http://sites.google.com/site/keepconnext/


1
端口的工作几乎完成,详情请见:http://sites.google.com/site/keepconnext/。 - Dr.7

10

这似乎是防火墙问题。

您可以在服务器的SQLNET.ORA文件中设置EXPIRE_TIME参数,可能会有所帮助。从文档中得知:

使用参数SQLNET.EXPIRE_TIME指定时间间隔(以分钟为单位),发送探测以验证客户端/服务器连接是否活动。设置大于0的值可以确保连接不会因异常客户端终止而无限期保持开放状态。如果探测发现已终止的连接或未使用的连接,则返回错误,导致服务器进程退出。此参数主要用于处理多个连接的数据库服务器。

关于EXPIRE_TIME的10g文档


1
我成功地测试了这个参数的有效性。谢谢! - Frederic Conrotte

8

这似乎不是SQL开发人员的问题,我从未遇到过。你确定它不是其他问题,比如你的网络?如果您从桌面连接到SQL Plus会发生什么。


有点晚了,但是没错,这是一个网络问题。 - Kevin Babcock
@KevinBabcock,你在这里遇到了什么网络问题? - theCodeMachine
我有Toad和Oracle SQL Developer,但是Oracle SQL Developer总是断开连接并尝试重新连接,非常烦人。与此同时,Toad可以一整天保持连接。现在由于业务原因,我不得不离开Toad。 - Albert Català

5

作为临时解决方案,您可以在“数据网格”的侧边栏中找到“DBMS输出”选项卡,打开DBMS输出并将轮询频率设置为适当的时间。


不错的建议...我不太清楚你所说的“数据网格”是什么,但我在“查看 > 数据库输出”(ALT,V,D)下找到了它。 - Daniel F. Thornton

3

我们的数据库管理员似乎已经找到了解决方案:

2.2. 如果OC4J实例和数据库之间存在防火墙 防火墙可能会丢弃对数据库服务器的非活动jdbc连接。 但是,OC4J实例无法检测到防火墙已超时关闭与数据库的连接。 Oracle Net可以配置Dead Connection Detection(SQLNET.EXPIRE_TIME)来解决此问题。 将EXPIRE_TIME设置为小于防火墙连接超时值的值,以便DCD保持与数据库的连接处于活动状态。 请参见注释151972.1“死连接检测(DCD)解释”。 由于这是在数据库服务器上配置的设置,而不是在中间层上配置的设置,因此它将适用于所有数据库连接(OCI和thin JDBC)。 替代方案: - 禁用或增加防火墙的空闲超时参数。 或者 - 将TCP Keepalive时间设置在数据库和中间层服务器上,并将其设置为小于防火墙连接超时的值。 设置TCP Keepalive时间后,机器将在指定的分钟数后重复发送空数据包以保持连接处于活动状态。 由于数据包每次都在防火墙空闲超时内发送,因此连接不会被关闭。


1

#1. 与数据库管理员确认所使用连接的用户配置文件,然后检查配置文件中的非活动超时时间。

#2. 在 SQL Developer 中更改连接设置为连接类型=基本,并使用 SID(而不是服务名称)。

Connection Properties in SQL Developer

如果您使用Connection Type=TNSNAMES或Service Name而不是SID,连接将会断开。

方案#2对我不起作用,使用基本连接时我的连接会断开 :/ - Nicolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接