2016-07-22 72 views
0

리더 열기에서 Connection con = ds.getConnection(); (여기서 ds는 DataSource 임)이라는 연결을 만들고 리더.JSR 352 : 연결이 닫혔습니다. 분할 된 단계의 판독기 close()에서 연결이 닫히면 오류가 발생합니다.

하지만 난이 작업의 중간에 여러 파티션 작업을 실행할 때, 내가 얻을 연결 내가 파티션 중 하나가 완료되면 이런 가정 폐쇄 오류

Caused by: java.sql.SQLException: [jcc][t4][10335][10366][3.58.82] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003 DSRA0010E: SQL State = 08003, Error Code = -4,470

에게 있습니다.

제 질문은 왜 이런 일입니까? 어떻게 연결을 처리해야합니까? 또는 Java가 연결을 닫는 처리합니까?

I에서는 WebSphere 자유에 UPDATE 자바 배치를 사용하고 있습니다 :

<jdbcDriver libraryRef="DB2JCC4Lib"/> 

<properties.db2.jcc databaseName="" driverType="4" password="" portNumber="" queryDataSize="65535" serverName="" user=""/> 

</dataSource> 




public class Reader implements ItemReader { 
private DataSource ds = null; 
private Connection con = null; 
public Reader() { 

} 

public void close() { 
    try { 
     con.close(); 
     rs.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

} 

/** 
* @see ItemReader#readItem() 
*/ 
public Object readItem() { 
    String s=""; 
    try { 
    if (rs.next()) { 
       for (int i = 1; i <= 10; i++) { 
        s+=rs.getString(i);      
       } 
       return s; 
      } 
     else { 
      return null; 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
public Serializable checkpointInfo() { 

} 

public void open(Serializable checkpoint) { 

    if (ds == null) { 
     try { 
      ds = (DataSource) new InitialContext() 
        .lookup("java:comp/env/jdbc/dataSource"); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 

    try { 
     con = ds.getConnection(); 
     statement= con 
       .prepareCall("call abc.xyz(?)"); 
     statement.setString("param", "xxx"); 
     boolean result= statement.execute(); 
     if (result) { 
      rs = statement.getResultSet(); 
      if (rs == null) { 
       throw new NullPointerException(); 
      }    
     } else { 
      throw new SQLException(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

} 내가 JSR-352의 배치가 정확히 처리를 처리 알고하지 말자 [ERROR ] J2CA0024E: Method rollback, within transaction branch ID {XidImpl: formatId(57415344), gtrid_length(36), bqual_length(40), data(0000015645eff4470000000915937ff85f46c3ed056b19010aa5147e1183f8d3ae81c04c0000015645eff4470000000915937ff85f46c3ed056b19010aa5147e1183f8d3ae81c04c00000001)} of resource pool connectionManager[Pool], caught com.ibm.ws.exception.WsException: DSRA0080E: An exception was received by the Data Store Adapter. See original exception message: [jcc][t4][10335][10366][3.58.82] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003. with SQL State : 08003 SQL Code : -4470

+1

당신은 연결 및 ResultSet의 사용을 보여주는 몇 가지 예제 코드를 게시 할 수 있습니까? 당신은 스레드간에 공유하지 않는 당신입니까? 또한 server.xml의 DataSource/JDBC 설정을 보여줄 수 있으며 [이 질문에 언급 된 "공유되지 않은 연결"접근법을 사용하고 있는지 언급 할 수 있습니까 (http://stackoverflow.com/questions/36935252/in-a- liberty-batch-chunk-step-getting-resultset-is-closed-when-scrolling-th #). –

+0

예 공유되지 않은 연결 방식을 사용하고 있습니다. 문제는 close()에서 연결을 닫을 때만 발생합니다. 내가 그것을 제거하면, 그것은 잘 작동합니다. –

+0

ResultSet 전에 Connection을 닫고 있습니다. 먼저 ResultSet을 닫아야합니다. –

답변

0

의 완전한 오류 메시지 스프링 배치와 같은 방식이지만 ...

Spring Batch에서 청크 처리를 사용하는 독자가 있다면 문제를 해결하기 위해 할 수 있다고 생각하는 것이 openConnection()beforeRead()에 넣고 closeConnection()afterRead()에 넣는 것입니다.

이렇게하려면 수신기를 구현해야합니다. 이것들을 확인해 보면 내가 무슨 말을하고 있는지 알 수 있습니다.

Spring Annotation Type BeforeRead

Interface ItemReadListener