我们在Oracle中部署了一些WebLogic,该服务的主要响应性是调用存储过程并将数据发送给客户端。服务的技术堆栈是:
服务从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服务器,或者将自动提交关闭,然后打开。这种情况几乎每天发生5次。
有什么线索吗?WebLogic是与网络服务代码有关的数据库问题吗?
发布于 2013-05-16 11:03:10
根据注释,这不是一个答案,但是显示了一个例子,如果您的查询在某个时候调用了一个函数,那么可能会发生什么。
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的第一部分是false,所以它确实调用了函数,这会引发错误。
但是,错误堆栈显示了问题的真正来源,除非您捕获(并压缩)堆栈,或者您的客户端没有报告它。直接从SQL*Plus调用包过程将显示整个堆栈,前提是您知道导致问题的参数,而不是压缩错误。
但还不清楚问题是只影响某些参数值,还是基于某些瞬态的(如sysdate),或者确实是由其他完全原因引起的。首先,我想看看您是否可以像这样可靠地复制它,如果可以,那么错误堆栈应该会让您更好地了解正在发生的事情。
https://stackoverflow.com/questions/16576664
复制相似问题