2015-07-07 4 views
-1

Мне очень нужна ваша помощь. У меня есть JDBC-код, который вызывает хранимую процедуру oracle. Это класс, который имеет код:хранимая процедура не выполняется.

public class DAOImpl { 

    private String sql = "{call MAIN.SP_CALC(?,?,?,?,?)}"; 
    private Connection conn = null; 

    public DAOImpl(Connection conn) { 
     this.conn = conn;    
    } 

    @Override 
    public synchronized void executeSP(String year, String month, Long id) throws SQLException { 
     try (CallableStatement cs = conn.prepareCall(sql);) { 
      cs.setObject(1, id); 
      cs.setObject(2, year); 
      cs.setObject(3, month); 
      cs.setObject(4, 0); 
      cs.registerOutParameter(5, Types.INTEGER); 
      cs.execute(); 
     } 
    } 

} 

У меня есть два клиента, для этого класса, класса JavaSE Tester и лиц без EJB. Основной JavaSE() метод имеет следующий код:

 try { 
      DriverManager.registerDriver(new OracleDriver()); 
      Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      DAOImpl dao = new DAOImpl(conn);    
      dao.executeSP("2015", "02", 99561010l); 
     } catch (SQLException ex) { 
      Logger.getLogger(SPTester.class.getName()).log(Level.SEVERE, null, ex); 
     } 

апатридом EJB имеет этот другой код:

 try {    
      conn = ds.getConnection(); 
      DAO dao = DAOImpl(conn);     
      dao.executeSP("2015", "02", 99561010l);     
     } catch (SQLException ex) { 
      throw new SQLException(ex); 
     } finally {     
      conn.close(); 
     } 

DS является переменной экземпляра вводили в EJB в качестве источника данных, который приходит от соединения JDBC Бассейн объявлен в стеклянную рыбу типа oracle.jdbc.xa.client.OracleXADataSource. Переменные DB_URL, USER, PASS программы JavaSE имеют те же значения, которые используют пул соединений JDBC

Как вы заметили, единственное отличие - это объект Connection. Оба JavaSE и EJB используют драйвер ojdbc6.jar. Оба используют java 1.7.0_u2, поэтому я использую try-with-resources.

Проблема в том, что работает только JavaSE! Оба они возвращаются после нескольких секунд обработки, но работает только программа JavaSE. Я пробовал много вещей .. СМТ и BMT EJB, упаковываются и развернутые типы ид, синхронизация и unsynchronize метод и т.д. Мне нужен этот код работает в EJB :(

Что такое случился с моей EJB?

заранее спасибо

+0

Вы забыли подробно рассказать, как именно EJB не работал , Не совершена ли транзакция или нет? – BalusC

+0

привет BalusC, спасибо за ваш ответ. Теперь я опубликую версии EJB, которые я сделал в CMT и BMT. С CMT по умолчанию, я знаю, что контейнер делает фиксацию, когда метод заканчивается, я прав? с BMT я сделал commit явно. Пожалуйста, проверь это – jmann

ответ

0

Это версия CMT в EJB

@Stateless 
@LocalBean 
@Interceptors({PropagateSessionContextInterceptor.class}) 
public class CalcBean extends BaseContextSessionBean { 

@Resource(mappedName = "jdbc/maestro") 
protected DataSource ds; 
public Connection conn = null; 

public void executeSP(String year, String month, Long id) throws SQLException { 

    try { 
     conn = ds.getConnection(); 
     DAO dao = DAOImpl(conn); 
     dao.executeSP("2015", "02", 99561010l);         
    } catch (SQLException ex) { 
     throw new SQLException(ex); 
    } finally {     
     conn.close(); 
    } 


} 

} 

Это версия BMT в EJB

@Stateless 
@LocalBean 
@Interceptors({PropagateSessionContextInterceptor.class}) 
@TransactionManagement(TransactionManagementType.BEAN) 
public class CalcBean extends BaseContextSessionBean { 

@Resource(mappedName = "jdbc/maestro") 
protected DataSource ds; 
public Connection conn = null; 

@Resource 
UserTransaction tx; 

public void executeSP(String year, String month, Long id) throws SQLException { 
    try { 
     try { 
      tx.begin(); 
      conn = ds.getConnection(); 
      DAO dao = DAOImpl(conn); 
      dao.executeSP("2015", "02", 99561010l);     
      tx.commit(); 
     } catch (SQLException ex) { 
      throw new SQLException(ex); 
     } finally {     
      conn.close(); 
     } 
    } catch (Exception e) { 
     throw new EJBException(e); 
    } 

} 

} 

public class BaseContextSessionBean { 

@Resource 
public SessionContext ctx; 

} 

public class PropagateSessionContextInterceptor { 

    @AroundInvoke 
    public Object myInterceptor(InvocationContext ctx) throws Exception 
    { 
    BaseContextSessionBean sb = (BaseContextSessionBean)ctx.getTarget(); 
    ControlListener.setSessionContext(sb.ctx); 
    Object o = ctx.proceed(); 
    return o; 
    } 

} 

public interface DAO { 
    public void executeSP(String year, String month, Long id) throws SQLException; 
} 

Я не знаю причины BaseContextSessionBean и PropagateSessionContextInterceptor. Первоначально EJB использовал бесполезную структуру JDBC (которая использует эти классы), поэтому я заменил ее классом DAOImpl. Я использую интерфейс DAO для развязки реализации, выполняется DaoImpl (в EJB DAOImpl реализует DAO, я забыл поставить это в предыдущем сообщении)

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