【发布时间】:2012-12-08 21:29:43
【问题描述】:
上下文:Grails 2.1,使用 Groovy SQL 执行 SQL 语句。数据库是在 RedHat VM 中运行的 Oracle 11G。 Grails 以交互模式运行,尽管作为 WAR 运行在行为上没有区别。
通过 Groovy SQL,我发出了一个具有这种结构的 SQL 语句:
insert into...
select ... from...
这会导致提取和插入@119K 行。当它成功运行时,它通常会在一分钟内完成。
此语句在整个数据导入应用程序的上下文中运行,该应用程序通常总共需要大约 10 分钟才能运行并包含许多其他查询。
这是行为:
- 我启动 Grails 应用程序
- 我开始在应用程序中导入数据。它按预期运行并导致数据发生重大变化
- 我再次启动应用程序。前几十个查询运行良好
- 在上述较大的插入处,它挂起。
所以:第一次通过,没问题。第二次通过,它每次都挂在同一个地方。
如果我重新启动应用程序,它会再次运行良好。
这就是奇怪的地方:我会让这个东西旋转一段时间,如果我关闭数据库,查询会继续运行。我没有错误。
所以,如果这种行为听起来很熟悉,我对解决方案很感兴趣。
如果您对如何诊断此问题有任何想法,我也对此感兴趣。我是一名应用程序开发人员,并且比 Oracle 方面更熟悉 Java 方面,fwiw。我正在尝试寻找一个内部的 Oracle DBA 来提供帮助,但至少在短期内我只能靠自己了。
感谢您的建议。
【问题讨论】:
-
尝试运行sqlplus并查询锁:shutdownabort.com/dbaqueries/Performance_Locks_DML.php
-
如果您的所有语句都是插入语句,如果两个不同的事务插入相同主键值,就会发生这种情况。
标签: java sql oracle grails groovy