«Хранимая процедура« xxx »может быть запущена только в режиме нецепной транзакции».ошибка при вызове процедуры из источника данных в контексте EJB - PullRequest
1 голос
/ 06 октября 2010

У нас есть база данных в Sybase, к которой мы обращаемся с сервера Java.

Доступ к БД был сделан непосредственно через драйвер Sybase, используя DriverManager.Он работал правильно, мы смогли вызвать наши хранимые процедуры.

Недавно мы мигрировали на сервер приложений (на JBoss 5), и теперь вызовы к базе данных выполняются через соединитель JNDI, используяa DataSource:

Properties ppt = new Properties();
ppt.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
ppt.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
ppt.put("java.naming.provider.url", "jdbc/sybase");

InitialContext ctx = new InitialContext(ppt);
DataSource ds = (DataSource) ctx.lookup(AConfig.getInstance().getDatasourceJndiName());

Connection conn = ds.getConnection();

(Источник данных настраивается с использованием базовых настроек из JBoss )

Однако впри данной настройке несколько процедур завершаются с ошибкой:

«Хранимая процедура» ** 'может быть запущена только в режиме транзакции без цепей. "

или этот тип, для других случаев (с изменением сбойной команды):

Команда TRUNCATE TABLE не разрешена в транзакции с несколькими операторами

Из того, что я нашелв Интернете это выглядит так, будто что-то в JBoss или коннектор открывает саму транзакцию, вызывая эти ошибки.Таким образом, различные решения, которые я мог бы найти для этих конкретных проблем, слишком локализованы, и это кажется большой проблемой.

Есть ли способ предотвратить такое поведение (если предположить, что это настоящая проблема)?


Мои знания в этой конкретной области весьма скудны, для меня это ново.Таким образом, в этом описании, вероятно, отсутствуют важные детали.Пожалуйста, укажите, как я могу улучшить этот вопрос, какие детали я могу добавить, если это необходимо.

Ответы [ 3 ]

6 голосов
/ 27 марта 2012

Очевидно, что в Sybase хранимые процедуры создаются для запуска в цепочечном или нецепном режиме.

Если вы получаете эту ошибку, это означает, что ваш SP был создан как Unchained. Эта строка Java conn.setAutoCommit(false); переводится как "set chained on".

Вы можете запустить этот Sybase SP, чтобы отобразить режим транзакций всех ваших SP в вашей БД:

sp_procxmode

Таким образом, вам нужно вызвать своего SP в режиме без цепочки и явно использовать, создавать транзакцию, фиксировать транзакцию и транзакцию отката.

Например:

insert into publishers 
    values ("9906", null, null, null)
begin transaction
delete from publishers where pub_id = "9906"
rollback transaction

См. Эту ссылку.

1 голос
/ 23 октября 2010

Это не правильно.

Конечно, посмотрите на картину в целом.Но есть еще большая картина.

Сервер приложений или нет, это не проблема.Настройки в JBoss по сравнению с предыдущим сервером приложений (Java) являются проблемой.Ваши кодеры правильно позаботились о том, чтобы их хранимые процессы выполняли истинные транзакции, и они защищены от подрывной деятельности внешними объектами ( любой , вызывающий хранимый процесс или сервер приложений).Если они это сделали, то эти sprocs будут запускаться с любого сервера приложений.

«Рефакторинг» предназначен для мира MS, он вообще не требуется в мире Sybase или Relational.Если вы измените sprocs, чтобы удалить жесткий контроль транзакций, бизнес пострадает: потеря целостности данных;потеря ссылочной целостности;потерянные обновления;дублирующие транзакции;и т. д. Если вы собираетесь подорвать sprocs или удалить управление транзакциями (в отличие от «рефакторинга»), имейте в виду, что последствия огромны.

Очевидно, JBoss по умолчанию либо AUTOCOMMIT, либо SET CHAINED ON(потому что многие люди не пишут истинные транзакции, а это значения по умолчанию для MS SQL), а ваш предыдущий сервер Java (приложений) этого не делал.

Во-вторых, ODBC очень медленный по сравнению с прямым соединениемтак что, если вы еще этого не почувствовали, знайте, что вы это сделаете, очень скороИсточники данных не "реализованы", они просто настроены (занимает несколько минут).Они используют ODBC или JDBC.Это слой FAT между программой и базой данных, который помещает небольшой буфер, и, конечно, теряет весь контроль, которым вы пользовались и пользовались раньше, когда у вас было собственное соединение.Я видел это целых двенадцать раз медленнее.

В-третьих, никто не проверял JBoss (a), прежде чем выбрать его, для родного подключения Sybase (в отличие от универсального MSориентированный), (б) во время реализации и (в) во время тестирования?

Если проблема связана с вашими соединениями, то, разумеется, просто решите проблему с подключением и реализуйте пул соединений (Java и Sybase имеют библиотеки для этого).) вместо того, чтобы снижать качество и производительность вашего приложения, а также согласованность (это C в ACID) базы данных.

EAServer (Sybase) и WebShpere (IBM) не имеют таких проблем;они выполняют пул соединений;и они используют собственное соединение с ASE (ODBC или JDBC не требуется).

1 голос
/ 06 октября 2010

Это может помочь: http://forum.springsource.org/showthread.php?t=49398, «Холли», похоже, решила проблему

...