我们在Oracle WebLogic Servers中部署了一些Web服务,此服务的主要责任是调用存储过程并将此数据发送到客户端。服务的技术堆栈是:
服务从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服务代码吗?
答案 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
),或者确实是完全由其他原因引起的。我首先要看看你是否可以像这样可靠地复制它,如果可以,那么错误堆栈可以让你更好地了解发生了什么。