2013-05-15 2 views
3

У нас есть несколько веб-служб, развернутых в Oracle WebLogic Servers, и основная ответственность этих служб заключается в вызове хранимых процедур и отправке этих данных клиентам , Стек технологии Услуг является:ORA-14552: не может выполнить DDL, совершить или откат внутри запроса или DML

  • JAX-WS
  • Spring Framework
  • MyBatis

Службы получает подключения к базе данных из пула соединений, предлагаемых WebLogic. В течение нескольких месяцев Богослужения работает нормально, но это дни мы с следующей проблемой:

SERVER: WLSDesa_ManagedServer1 [DEBUG] [15-05-2013 12:23:03.897] (JakartaCommonsLoggingImpl.java:46) - ooo Using Connection [weblog[email protected]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, проблема с базой данных o это код веб-сервиса?

+1

Зачем использовать auto commit? В общем, это не лучший способ работать с вашей базой данных. (делать что-то вроде аудита/протоколирования в рамках процедуры/функций, которые вы используете?) –

+0

Является ли 'select' внутри пакета вызовом каких-либо функций, которые, возможно, были объявлены безопасными с помощью прагмы, но на самом деле делают то, что они не должны ? Звучит маловероятно из того, что вы сказали, но может быть прерывистым, если вызов находится в предложении 'where' и не всегда достигается. Также не думайте, что это вполне соответствует, но когда это происходит, вы получаете недавно созданное соединение из пула, и у вас есть триггер входа в систему, который совершает? (Сжатие на соломинках, ясно ...) –

+0

@ik_zelf Мы используем конфигурацию по умолчанию для пула соединений, которая поставляется с WebSphere. Мы пытались исправить эту проблему с помощью автоматической фиксации. –

ответ

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 

Это прекрасно, потому что на сегодняшний день является шестнадцатым, поэтому первая часть 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) или действительно вызвано чем-то другим полностью. Я бы начал с того, что смогу воспроизвести его надежно, как это, хотя, если вы можете, то стек ошибок должен дать вам представление о том, что происходит.

+0

Процедура - это простой выбор, мы не вызываем никаких процедур, связанных с транзакциями. Может быть, нам стоит искать триггеры? –

+0

@CarlosGavidia - вы можете проверить триггер входа в систему, не уверенный, что какой-либо другой вид может вступить в игру. Я не хочу выкапывать мертвую лошадь, но мне пришло в голову, что выбор может потенциально быть на виду, который вызывает функцию, которая была бы менее очевидной. Можете ли вы сделать это от обычного клиента, а не от Java (т. Е. SQL * Plus или SQL Developer или аналогичного)? –

+0

Un update: одна ошибка возникает, есть другие процедуры, которые генерируют одно и то же исключение –