Использование API разграничения транзакций для менеджера ресурсов в EJB 3.x - PullRequest
1 голос
/ 08 марта 2012

В соответствии со спецификацией EJB 3.0: когда экземпляр находится в транзакции, он не должен пытаться использовать API-интерфейс для разграничения транзакций для конкретного администратора ресурсов (например, он не должен вызывать метод commit или rollback в интерфейсе java.sql.Connection или в javax.jms.Session interface) В 13.3.3 Спецификации. Я попробовал один пример - где в управляемой BEAN транзакции я включил java.sql.Connection.commit () - создал компонент без сохранения состояния в NetBeans как EE5, развернул на Glassfish 3.1 и контейнер не жаловался? Метод Bean обновляет базу данных без ошибок в журнале Glassfish. Это ожидаемое поведение?

Кроме того, нет такого ограничения на использование java.sql.Connection.commit () для bean-компонентов с транзакциями, управляемыми контейнерными транзакциями, упомянутыми в спецификации. Спасибо Бранислав

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.*;
import javax.persistence.Transient;
import javax.sql.DataSource;
import javax.transaction.*;


/**
 *
 * @author bane
 */
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MySession implements MySessionRemote {
    @Resource(name = "SAMPLE")
    private DataSource SAMPLE;

   //
   @Resource UserTransaction utx;

//gore je novi kod
    @Override
    public String getResult() {
        return "This is my Session Bean";
    }

      public void doSomething() {
        try {
            Connection conn = SAMPLE.getConnection();
            Statement stmt = conn.createStatement();
            String q = "select * from BOOK";
            String up = "update BOOK set PRICE = PRICE + 1";
           utx.begin();
           int num = stmt.executeUpdate(up);
           System.out.println("num: "+num);
           ResultSet rs = stmt.executeQuery(q);
           //is conn.commit() legal?
           conn.commit();
           String name = null;
           int price = 0;
           while (rs.next()) {
               name = rs.getString(2);
               price = rs.getInt(3);
               System.err.println(name+" , "+price);

           }

           utx.commit();
        } catch (SQLException ex) {
            Logger.getLogger(MySession.class.getName()).log(Level.SEVERE, null, ex);

        } catch (Exception ex) {
             Logger.getLogger(MySession.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

}
...