2016-03-08 3 views
0

У меня есть сервер backend на Java 6 с JBoss 5.1. Я должен вызвать процедуру Oracle (хранится на упаковке) на этот код в метод, как:Выполнение CallableStatement блокирует приложение

cs = conn.prepareCall("{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}"); 

     cs.setString(1, <data>); 
     cs.setString(2, <data>); 
     cs.setString(3, <data>); 
     cs.setDate(4, <data>); 
     cs.setString(5, <data>); 

     cs.registerOutParameter(6, Types.VARCHAR); 
     cs.registerOutParameter(7, Types.VARCHAR); 
     cs.registerOutParameter(8, Types.BIGINT); 

     cs.setInt(9, <data>); 


     try{ 
      cs.execute(); 
     }catch (RuntimeException e){ 
      e.getMessage(); 
     }catch (Exception e){ 
      e.getMessage(); 
     } 


     Long numerr = cs.getLong(8); 

Проблема возникает, когда я называю cs.execute(). Этот вызов блокирует выполнение и не может продолжать нормальное выполнение и сохранять данные.

Надо сказать, что эта процедура нормального выполнение вставки данных в другие таблицы на основе третьей таблицы, в которой я вставить ранее данные с созданием нормального класса и EntityManager.persist(<entity>) и EntityManager.flush().

Это не Грант разрешения проблема, потому что я могу выполнить процедуру на SQLDeveloper с правильным предложением и надлежащего пользователя/пароля.

+0

ли вставки делается путем вызова процедуры в SQL Developer были совершены или откат? Похоже, что вставка просто заблокирована другим сеансом. –

+0

Mmmm, я так не думаю, хотя я пытался вставить свои предыдущие данные, закрыть соединение, создать другое соединение, создать вызываемый оператор, а затем выполнить, и проблема все еще сохраняется, 'cs.execute()' still blocks –

+0

Но вы что вы успешно его запускали из SQL Developer. Я говорю об этой сессии, а не о том, что вы делали ранее с Java. –

ответ

0

Наконец-то я обнаружил, в чем проблема. Вы не можете одновременно использовать EntityManager, чтобы сохранить объект, а затем выполнить процедуру, которую вы должны вызвать изначально. Таким образом, решение заключалось в том, чтобы сохранить мою сущность изначально (с помощью вставки, используя PreparedStatemnt);

"Insert into <table> (<column1>, <column2>,...,<columnN>) values (?, ?,...,?)" 

И затем выполнить процедуру в правильном направлении:

"{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}" 

Похоже, причина в том, что вы не можете выполнить в тот же @Transactional способом два различных способа исполнения: EntityManager упорствовать-полосная и способ выполнения собственной процедуры.

Я надеюсь, что это может помочь любому :-)

Смежные вопросы