我正在尝试使用jdbc模板在batchupdate中进行插入,但出现以下错误。 我的应用程序一直存在,并在事件到达时每小时执行多次插入。 我找到了一个解决方案,该解决方案在每次调用该方法然后关闭它时都会生成一个连接,但这不是正确的选择。 我只需要通过Bean使用一次生成的连接。 任何解决方案吗?
我的代码:
private void insertarDatosEnDB(List<RowObject> dbObjectList) {
try {
String sql = "INSERT /*+ APPEND IGNORE_ROW_ON_DUPKEY_INDEX(" + table + "," + "NOKIA_JSON_RAW_PK " + ") */ INTO " + table +
" (FECHA, NOMBRE_PROYECTO,NOMBRE_ARCHIVO, TIPO, DOCUMENTO) VALUES (?, ?, ?, ?, ?)";
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
RowObject ci = dbObjectList.get(i);
ps.setDate(1, new java.sql.Date(ci.getFecha().getTime()));
ps.setString(2, ci.getNombre_proyecto());
ps.setString(3, ci.getNombre_archivo());
ps.setString(4, "ALGUN-TIPO");
// Usando directamente un CLOB
Clob clob = ps.getConnection().createClob();
clob.setString(1, ci.getJson());
ps.setClob(5, clob);
}
@Override
public int getBatchSize() {
return dbObjectList.size();
}
});
LOGGER.info("Se han insertado datos en la tabla con el nombre de archivo: {}", dbObjectList.get(0).getNombre_archivo());
} catch (Exception e) {
String archivo = dbObjectList.get(0).getNombre_archivo();
/*try {
FileUtils.writeStringToFile(new File(".\\" + archivo + "_" + System.currentTimeMillis() + ".txt"), dbObjectList.get(0).getJson().toString());
} catch (IOException e1) {
e1.printStackTrace();
}*/
LOGGER.error("Error al insertar archivo {} en DB Class: {}\n -Message: {}\n -Cause: {}\n -StackTrace: {}", archivo, e.getClass(), e.getMessage(), e.getCause(), e.getStackTrace());
e.printStackTrace();
}
}
public void persistirDatosEnDB(List<RowObject> dbObjectList) {
TransactionTemplate template = new TransactionTemplate(transactionManager);
template.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
try {
insertarDatosEnDB(dbObjectList);
}
catch (Exception e){
LOGGER.error("Error al insertar en DB Class: {}\n -Message: {}\n -Cause: {}\n -StackTrace: {}", e.getClass(), e.getMessage(), e.getCause(), e.getStackTrace());
}
}
});