2016-07-22 3 views
0

Я создаю соединение Connection con = ds.getConnection(); (где ds - это DataSource) в открытии Reader и закройте его в close() Читатель.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 заботится о закрытии соединений?

Я использую Java Batch на WebSphere Liberty 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(); 
    } 

} 

}

Полное сообщение об ошибке [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? Вы не разделяете темы, не так ли? Можете ли вы также показать конфигурацию DataSource/JDBC из server.xml, а также указать, используете ли вы подход «не разделенных соединений», упомянутый в [этом вопросе] (http://stackoverflow.com/questions/36935252/in-a- либерти пакетный кусок шаг получения-ResultSet-это-замкнутые, когда прокрутка-й #). –

+0

Да, я использую подход Unshared Connections. Проблема возникает только тогда, когда я закрываю соединение в close(). Если я удалю его, он отлично работает. –

+0

Вы закрываете соединение перед ResultSet. Сначала вы должны закрыть ResultSet. –

ответ

0

Я dont't знаю, если Batch JSR-352 обрабатывает обработку точно так же, как весенний пакет, но ...

Весной Batch, если у вас есть Reader, который использует обработку chunk, я думаю, что вы могли бы сделать, чтобы решить проблему, поставить openConnection() в beforeRead() и closeConnection() в afterRead().

Для этого вы должны внедрить прослушиватель. Проверьте их, чтобы вы поняли, о чем я говорю.

Spring Annotation Type BeforeRead

Interface ItemReadListener

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