ORA-14552:无法在查询或DML中执行DDL,提交或回滚

时间:2013-05-15 23:30:26

标签: web-services oracle java-ee transactions weblogic

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

  • JAX-WS
  • Spring Framework
  • 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服务代码吗?

1 个答案:

答案 0 :(得分: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),或者确实是完全由其他原因引起的。我首先要看看你是否可以像这样可靠地复制它,如果可以,那么错误堆栈可以让你更好地了解发生了什么。