2017-03-09 5 views
0

CDI를 사용하여 DAO 클래스에 Connection을 삽입하고 있습니다.j2ee 삽입 된 연결이 트랜잭션이 처리되지 않음

연결 생산자는 다음과 같이이다 : 예를 들어 내 DAO 클래스의 다음

public class ConnectionManager { 
    private static final Logger LOGGER = Logger.getLogger(ConnectionManager.class.getName()); 

    @Resource(mappedName = "java:/PostgresXADS") 
    private DataSource flamingoDs; 

    @Named("flamingoConnection") 
    @Produces 
    @RequestScoped 
    public Connection createFlamingoConnection() { 
     LOGGER.info("createFlamingoConnection called"); 
     try { 
      return flamingoDs.getConnection(); 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } 
    } 
    public void closeConnection(@Disposes Connection c) { 
     LOGGER.info("closeConnection called"); 
     try { 
      c.close(); 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

나는이 :

public class GraphDao { 

@Inject 
@Named("flamingoConnection") 
Connection con; 

public String createObjNode(String tipoCod, String nome, Object flmNodeData) 
     throws JsonProcessingException, SQLException, IllegalArgumentException { 
    if (tipoCod == null || flmNodeData == null || nome == null) { 
     throw new IllegalArgumentException("Empty parameters"); 
    } 
    LOGGER.info("createObjNode start"); 
    String generatedUuid; 
    String sql = "INSERT INTO graphdb.nodo_oggetto (tipo_cod, nome, dati) VALUES(?, ? ,?) RETURNING uuid"; 
    PGobject jsonObject = getJsonPgObj(flmNodeData); 
    try (PreparedStatement stmt = this.con.prepareStatement(sql);) { 
     stmt.setObject(1, tipoCod); 
     stmt.setString(2, nome); 
     stmt.setObject(3, jsonObject); 
     try (ResultSet rs = stmt.executeQuery()) { 
      rs.next(); 
      generatedUuid = rs.getString(1); 
     } 
    } 
    LOGGER.info("createObjNode end"); 
    return generatedUuid; 
} 

내가 컨테이너 관리 트랜잭션이있는 EJB 메소드 내부의 DAO 메소드를 호출하고 있습니다 .

연결이 현재 스레드의 범위에서 올바르게 삽입되고 닫히지 만 쿼리가 실행 된 후 즉시 DB에 커밋됩니다.

내가 사용하고 데이터 소스가 그것의 정의는 타입 XA의이다 :

<xa-datasource jndi-name="java:/PostgresXADS" pool-name="PostgresXADS" enabled="true" use-ccm="true"> 
    <xa-datasource-property name="url"> 
     jdbc:postgresql://localhost:5433/infostud?ApplicationName=NewSegr 
    </xa-datasource-property> 
    <driver>postgres</driver> 
    <xa-pool> 
     <prefill>true</prefill> 
     <is-same-rm-override>false</is-same-rm-override> 
     <no-tx-separate-pools>true</no-tx-separate-pools> 
     <wrap-xa-resource>true</wrap-xa-resource> 
    </xa-pool> 
    <security> 
     <user-name>XXX</user-name> 
     <password>XXX</password> 
    </security> 
    <validation> 
     <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/> 
     <background-validation>true</background-validation> 
     <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/> 
    </validation> 
</xa-datasource> 
<drivers> 
    <driver name="postgres" module="org.postgresql"> 
     <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> 
     <datasource-class>org.postgresql.ds.PGPoolingDataSource</datasource-class> 
</driver> 

내가 왜 무슨 일이 일어나고 10

누군가가 설명해 주시겠습니까 unsing PostgreSQL의 및 제이보스 해요? 죄송합니다

내 나쁜 영어

+0

당신이'createObjNode를 호출하는 예를 제공 할 수 있습니다()'하고 즉시 데이터베이스에 커밋을 수행합니까? – ytg

답변

0

당신이 연결 인스턴스에 액세스 할 수 있기 때문에, 당신은 false로 자동 위탁 설정을 시도 할 수 있습니다?

Connection conn = flamingoDs.getConnection(); 
conn.setAutoCommit(false); 
return conn; 

doc에 따르면 기본적으로 true로 설정됩니다. 그런데

, 나는 당신이 CDI 생산에서 연결을 생성하지해야한다고 생각하지만, 오히려 시도 -과 - 자원을 만들 :

try (Connection connection = dataSource.getConnection(); 
      PreparedStatement stmt = connection.prepareStatement(sql))