为什么在Java应用程序中第二次运行时会挂起sql查询?

时间:2012-12-08 21:29:44

标签: java sql oracle grails groovy

Context:Grails 2.1,使用Groovy SQL执行SQL语句。数据库是在RedHat VM中运行的Oracle 11G。 Grails以交互模式运行,但以WAR运行时行为没有区别。

通过Groovy SQL,我发出了一个带有这种结构的SQL语句:

insert into...
select ... from...

这会导致获取并插入@ 119K行。成功运行后,通常会在一分钟内完成。

此语句在整个数据导入应用程序的上下文中运行,该应用程序通常需要大约10分钟才能运行并包含许多其他查询。

这是行为:

  1. 我启动了Grails应用
  2. 我启动了应用程序中的数据导入。它按预期运行并导致数据发生重大变化
  3. 我再次启动应用程序。最初的几十个查询运行良好
  4. 在上面提到的较大的插页中,它会挂起。
  5. 所以:第一次通过,没问题。第二次,它每次都挂在同一个地方。

    如果我重新启动应用程序,它将再次正常运行。

    这里变得奇怪:我会让这个东西旋转一段时间,如果我关闭数据库,查询会继续运行。我没有错。

    所以,如果这种行为听起来很熟悉,我对解决方案感兴趣。

    如果你有关于如何诊断它的想法,我也对这些感兴趣。我是一名应用程序开发人员,比Oracle方面更熟悉Java方面,fwiw。我正在努力找到一个内部的Oracle DBA来协助,但至少在短期内我会靠自己。

    感谢您的建议。

1 个答案:

答案 0 :(得分:0)

由于你说重新启动应用程序使它再次起作用表明它在SQL端没有任何东西,比如索引,所以它可能与Hibernate会话大小有关,你可能会最大化会话,see this answer that may help