gpt4 book ai didi

web-services - ORA-14552 : cannot perform a DDL, 在查询或 DML 中提交或回滚

转载 作者:行者123 更新时间:2023-12-04 04:20:26 25 4
gpt4 key购买 nike

我们在 Oracle WebLogic 服务器中部署了一些 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 服务代码的数据库问题?

最佳答案

根据评论,这不是答案,而是显示可能发生的情况的示例,如果您的查询在某个时刻调用函数。

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 直接调用包过程将显示整个堆栈 - 假设您知道导致问题的参数并且您没有消除错误。

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

关于web-services - ORA-14552 : cannot perform a DDL, 在查询或 DML 中提交或回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com