我得到一个例外,
“在索引:: 1处缺少IN或OUT参数”
当我批量插入从csv文件中读取的数据时。有趣的是,只有当我循环使用jt.batchUpdate()方法时才会出现异常。否则插入成功。
因此,我的数据是成千上万的..我想以5000的批量插入它,但如果我没有得到例外。
代码示例:
for (int curRowCount = 0; curRowCount < dataCount; curRowCount += batchSize) {
jt.batchUpdate(insert_query, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
int rowCount=0;
try {
while ((line = br.readLine()) != null) {
final String[] data = line.split(cvsSplitBy);
if(rowCount>0){
ps.setTimestamp(1, new Timestamp(date.getTime()));
ps.setString(2, "A"); // so on
}
rowCount++;
}
} catch (Exception e) {
e.printStackTrace();
}}
@Override
public int getBatchSize() {
return dataCount;
}
});
}
答案 0 :(得分:0)
BatchPreparedStatementSetter将被Spring调用多次,因为它们是批处理中的元素。
它将在i = 0时第一次调用,并且该调用应该填充PreparedStatement参数以插入第一行。
然后它会在i = 1的情况下第一次被调用,并且该调用应该填充PreparedStatement参数以插入第二行。
等。等到达极限:dataCount
。
但是你的代码并没有这样做。第一次调用BatchPreparedStatementSetter时,它会读取阅读器中的所有行,设置第一行的参数,然后将其替换为第二行的参数等,直到读者不再有行为止。因此,您可以设置i = 0的参数,并使用文件最后一行中的值。然后Spring调用setter,因为i = 1,但是你的读者已经完全读完了,所以它没有在语句中设置任何参数,因此错误。