【问题标题】:Recovering from connection time exceeded in JPA从 JPA 中超过的连接时间中恢复
【发布时间】:2018-02-24 00:21:05
【问题描述】:

运行一项非常工作(使用数据库查找索引数万个文档),我收到此错误: java.sql.SQLException: ORA-02399: 超出最大连接时间,您正在注销

repository.findOne 调用发生错误。

进程在tomcat下运行。

我需要做的(我认为)是重新登录 Oracle 并获得新的连接。然而,JPA 相当有效地隐藏了所有这些细节。 (和春天更远)。我该如何进行?

【问题讨论】:

  • 你是如何连接的?是否配置了数据源?
  • 是的。我是。我后来发现 Oracle 系统管理员对连接施加了 4 小时的时间限制,因为他遇到了僵尸连接问题。他现在已将其更改为 4 天。
  • 仍然意味着您每 4 天就会遇到一个问题,除非您将数据源配置为重新连接。您需要添加设置,以便连接过时并在此之前被丢弃,以避免您的应用出现奇怪的问题。
  • 会话在 30 分钟不活动后超时。我的应用程序不是 oracle 陈旧连接的来源。但是,我感兴趣的是如何强制重新连接?使用spring,我的数据库交互是:a/设置数据源; b/ 查询存储库。 Spring auto-magic 正在管理连接。

标签: spring-data spring-data-jpa eclipselink


【解决方案1】:

如果您遇到这样的超时,重新连接不是您的主要问题。你需要让你的超时时间足够长,或者你的事务足够短,以免触发超时。

重新连接的问题通常是透明地处理连接池,除了测试之外,您当然应该将其用于所有事情。但这不会解决您的直接问题,即连接关闭并且您的事务回滚。

更新: 问题似乎不是事务持续时间,而是连接持续时间。

如果确实如此,您应该与负责此超时的 DBA 交谈,因为恕我直言,仅仅因为它们在给定时间内打开而关闭使用的连接是没有意义的。

您不能/不想手动关闭或重新打开连接。这是连接池的任务。如果您关闭从连接池中获得的连接,您并没有真正关闭它,而是将其返回到连接池。

相反,请将您的连接池配置为关闭连接并定期创建新连接。其工作方式取决于您使用的连接池。

【讨论】:

  • 我只是查询,不做任何交易。但是,问题是 Oracle 作业终止连接的时间超过 4 小时,
  • 你不能与 Oracle 交互,也不能与没有事务的 EntityManager 交互。
  • 嗯 em 和事务管理器在 spring 配置中有效地自动连接和数据源设置。 @Configuration @EnableJpaRepositories( basePackages="nz.cri.gns.mapservice.repository", queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND, entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager" ) 我只通过存储库进行交互。问题是如何显式管理该连接?
  • 编辑了答案。
  • 感谢这些 cmets。我已将连接超时延长至 4 天,因此希望能解决此问题。
猜你喜欢
  • 2015-10-29
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2014-07-07
  • 2020-02-01
  • 1970-01-01
  • 2017-02-20
  • 2016-11-08
相关资源
最近更新 更多