3

我们在 Oracle WebLogic Servers 中部署了一些 Web 服务,这些服务的主要职责是调用存储过程并将这些数据发送给客户端。服务的技术栈是:

  • JAX-WS
  • 春天框架
  • 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 服务代码?

4

1 回答 1

3

从评论开始,这不是一个答案,而是显示一个可能发生的例子,如果您的查询在某个时候调用一个函数。

create function f42 return number as
begin
    commit;
    return 0;
end;
/

Function created.

SQL> select * from dual where extract(day from sysdate) = 16 or f42 = 0;

D
-
X

这很好,因为今天是16号,所以第一部分or是真的,第二部分不需要评估;所以这个函数没有被调用。改变我正在寻找的那一天:

SQL> select * from dual where extract(day from sysdate) = 15 or f42 = 0;

select * from dual where extract(day from sysdate) = 15 or f42 = 0
                                                           *
ERROR at line 1:
ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
ORA-06512: at "STACKOVERFLOW.F42", line 3

这次的第一部分or是假的,所以它确实调用了函数,这会引发错误。

但是错误堆栈会向您显示问题的真正来源,除非您当然正在捕获(并挤压)堆栈,或者您的客户没有报告它。从 SQL*Plus 直接调用包过程将显示整个堆栈 - 假设您知道导致问题的参数并且您没有压缩错误。

但目前尚不清楚该问题是否仅影响某些参数值,还是基于某些瞬态(如sysdate),或者确实是完全由其他原因引起的。我会首先看看您是否可以像这样可靠地复制它,如果可以,那么错误堆栈应该让您更好地了解正在发生的事情。

于 2013-05-16T11:03:10.983 回答