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