【发布时间】:2013-05-10 17:03:14
【问题描述】:
我们在 Oracle WebLogic Servers 中部署了一些 Web 服务,这些服务的主要职责是调用存储过程并将这些数据发送给客户端。服务的技术栈是:
- JAX-WS
- Spring 框架
- MyBatis
服务从 WebLogic 提供的连接池获取到数据库的连接。几个月来,服务运行良好,但今天我们遇到了以下问题:
SERVER: WLSDesa_ManagedServer1 [DEBUG] [15-05-2013 12:23:03.897] (JakartaCommonsLoggingImpl.java:46) - ooo Using Connection [weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection@59bd]
SERVER: WLSDesa_ManagedServer1 [DEBUG] [15-05-2013 12:23:03.898] (JakartaCommonsLoggingImpl.java:46) - ==> Preparing: { call package.iOnlyDoASelect( ?, ?) }
a.package.from.project.CommonException: org.springframework.jdbc.UncategorizedSQLException:
### Error querying database. Cause: java.sql.SQLException: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
### The error may exist in a/package/from/the/project/ImAMyBatisMap.xml
### The error may involve a.package.from.the.project.ImADaoClass.invokeProcedure-Inline
### The error occurred while setting parameters
### SQL: { call package.iOnlyDoASelect( ?, ?) }
### Cause: java.sql.SQLException: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
; uncategorized SQLException for SQL []; SQL state [72000]; error code [14552]; ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
; nested exception is java.sql.SQLException: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
该过程只是一个Select对几个表,我们可以从另一个Java应用程序和数据库客户端正常调用它;在服务中,我们没有使用任何显式的事务管理代码。该问题偶尔发生并使服务无用。我们的解决方法是重新启动 WebLogic Server 或关闭自动提交,然后再打开。这种情况几乎每天发生 5 次。
有什么线索吗? WebLogic 是否相关,是数据库问题还是它的 Web 服务代码?
【问题讨论】:
-
为什么要使用自动提交?通常不是使用数据库的最佳方式。 (审计/日志记录之类的事情是否发生在您使用的过程/功能中?)
-
包内的
select是否调用了任何函数,这些函数可能已经用编译指示声明为安全但实际上正在做他们不应该做的事情?从您所说的听起来不太可能,但如果呼叫在where子句中并且并不总是到达,则可能是间歇性的。也不要认为它完全匹配,但是当它发生时,您是否从池中获得了新创建的连接,并且您是否有提交的登录触发器? (显然是抓着稻草……) -
@ik_zelf 我们使用 WebSphere 附带的连接池的默认配置。我们一直在尝试使用自动提交来解决此问题。
-
@AlexPoole 如何识别一个用 pragma 声明为安全的函数?
-
实际上我不确定它是否需要编译指示。您可以拥有一个只执行
commit的函数,并将其包含在查询中,只要它永远不会被评估;如果确实如此,您将收到此错误。 (所以它取决于谓词评估的顺序和结果)。您可以搜索所有源代码以查找提交/回滚/等。但是您不知道调用的是什么,因此您可能需要从另一端开始并查看您的查询正在调用哪些函数,并查看它们正在调用什么等。您可以将其缩小到并非总是如此调用,或尝试单独调用它们。
标签: web-services oracle jakarta-ee transactions weblogic