Socket closed

Mi nombre es Jorge.
Tengo un problema en una aplicación que desarrollaron en la empresa. El programa carga los registro en un Jtable, alli hacen las modificaciones que tengan que hacer los usuarios, como borrar, modificar e intsertar un nuevo registro, bueno hasta ahora todo bien, pero el problema comienza cuando el usuario va a guardar los datos a la base de datos, lo que he visto del programa es que los datos estan en un ArrayList y ese arreglo es el que envia en los metodos, hace un for Iterator para recorrer éste, asigna al PreparedStatement los datos correspondientes, luego hace un addBatch y cuando termina el iterator, ejecuta la siguitnte instruccion:
int row[] = pstm.executeBatch();
y es aqui en donde me jenera el error, en lo que he visto (No se si ese sea el problema) es que cuando pasa de 182 registro me sale el siguiente error:
java.sql.SQLException: System or internal error java.net.SocketException: Socket closed
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java)
at com.informix.jdbc.IfxSqli.sendBind(IfxSqli.java)
at com.informix.jdbc.IfxSqli.sendExecute(IfxSqli.java)
at com.informix.jdbc.IfxSqli.sendCommand(IfxSqli.java)
at com.informix.jdbc.IfxSqli.executeCommand(IfxSqli.java)
at com.informix.jdbc.IfxResultSet.executeUpdate(IfxResultSet.java)
at com.informix.jdbc.IfxStatement.executeUpdateImpl(IfxStatement.java)
at com.informix.jdbc.IfxPreparedStatement.executeBatch(IfxPreparedStatement.java)
Si alguien sabe o le ha pasado este problema.
Respuesta
1
No hay mucha información (tipos de campos del JTable, versión de la base de datos, etc...) pero puede ser por varias cosas:
- Problemas con los timeouts.
- Problemas con los campos del JTable. Parece que Informix cierra la conexión con BD cuando uno de los campos que se añaden al Batch es de tipo Blob (más concretamente si después de un parámetro Blob se añaden más elementos).
Se soluciona asegurándose que el Batch esté vacío antes de añadir más elementos al statement.
En Pseudocódigo sería algo así:
<pre>for each column in the PreparedStatement
if column is a Blob then
if resultSet.getObject(column) is not null then
PreparedStatement.executeBatch()
PreparedStatement. ClearBatch()
break out of for loop
end if
end if
end for
for each column in the PreparedStatement
Attach value to each parameter
end for
PreparedStatement.executeUpdate();
</pre>
Buenos días.
Disculpa, la BD es Informix 9.0 y te envio el método en donde estan los campos.
Espero que esto te pueda ayudar para ver con más detalle el problema.
private int insertAudiItemOP(ArrayList listItemOperations, String estado)throws SQLException{
String sql="INSERT INTO AUDI_PCROPEIT (codi_item, " +
"secncia_ttlos, nmero_secncia, cdgo_oprcion, cdgo_procso, cdgo_compnnte, nmbre_oprcion, " +
"desc_oprcion, frecncia, tmpo_cncddo, codi_prenda, prdccion_hra, cdgo_tpoprcion, cdgo_anlsta, " +
"fcha_crcion, tpo_maqnria, codi_usuario, audi_usrio, audi_estdo, audi_fcha) "
+ "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstm = connection.prepareStatement(sql);
for (Iterator iter = listItemOperations.iterator(); iter.hasNext();) {
ItemOperation itemOper=(ItemOperation)iter.next();
pstm.setString(1,itemOper.getItemId());
pstm.setInt(2,itemOper.getTitleSequence());
pstm.setInt(3,itemOper.getSequenceNumber());
pstm.setString(4,itemOper.getOperation().getOperationId());
pstm.setString(5,itemOper.getProcess().getProcessId());
if (itemOper.getComponent()==null)
pstm.setNull(6,Types.CHAR);
else
pstm.setString(6,itemOper.getComponent().getComponentId());
pstm.setString(7,itemOper.getOperationName());
pstm.setString(8,itemOper.getOperationDescription());
pstm.setFloat(9,itemOper.getFrequency());
pstm.setFloat(10,itemOper.getGrantedTime());
pstm.setString(11,itemOper.getClothing().getClothingId());
pstm.setFloat(12,itemOper.getProductionPerHour());
if (itemOper.getProcessType()==null)
pstm.setNull(13,Types.CHAR);
else
pstm.setString(13,itemOper.getProcessType().getProcessTypeId());
pstm.setString(14,itemOper.getAnalystId());
pstm.setDate(15,itemOper.getCreationDate());
pstm.setString(16,itemOper.getMachineryType());
pstm.setString(17,itemOper.getAnalystId());
pstm.setString(18,itemOper.getAnalystIdModif());
pstm.setString(19,estado);
pstm.setDate(20,itemOper.getModificationDate());
pstm.addBatch();
}
int row[] = pstm.executeBatch();
closeStatement(pstm,null);
return (row != null ? row.length : 0);
}
Puedes probar a modificar el bucle de la siguiente forma:
ArrayList rows = new ArrayList();
for (Iterator iter = listItemOperations.iterator(); iter.hasNext();) {
ItemOperation itemOper=(ItemOperation)iter.next();
pstm.setString(1,itemOper.getItemId());
pstm.setInt(2,itemOper.getTitleSequence());
pstm.setInt(3,itemOper.getSequenceNumber());
pstm.setString(4,itemOper.getOperation().getOperationId());
pstm.setString(5,itemOper.getProcess().getProcessId());
if (itemOper.getComponent()==null)
pstm.setNull(6,Types.CHAR);
else
pstm.setString(6,itemOper.getComponent().getComponentId());
pstm.setString(7,itemOper.getOperationName());
pstm.setString(8,itemOper.getOperationDescription());
pstm.setFloat(9,itemOper.getFrequency());
pstm.setFloat(10,itemOper.getGrantedTime());
pstm.setString(11,itemOper.getClothing().getClothingId());
pstm.setFloat(12,itemOper.getProductionPerHour());
if (itemOper.getProcessType()==null)
pstm.setNull(13,Types.CHAR);
else
pstm.setString(13,itemOper.getProcessType().getProcessTypeId());
pstm.setString(14,itemOper.getAnalystId());
pstm.setDate(15,itemOper.getCreationDate());
pstm.setString(16,itemOper.getMachineryType());
pstm.setString(17,itemOper.getAnalystId());
pstm.setString(18,itemOper.getAnalystIdModif());
pstm.setString(19,estado);
pstm.setDate(20,itemOper.getModificationDate());
pstm.executeUpdate();
}
int row[] = pstm.executeBatch();
closeStatement(pstm,null);
return (row != null ? row.length : 0);
}

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas