我正在尝试将+/- 250个单独的插入语句重写为1个批处理语句,但是它什么也没做。没有错误,没有回应
已遵循本指南: https://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/
此后,很多堆栈溢出,但我看不到问题
我的本地数据库:
<Resource name="jdbc/wtnfV2local" url="jdbc:postgresql://localhost:5432/wtnfV2local"
driverClassName="org.postgresql.Driver" auth="Container" type="javax.sql.DataSource"
username="postgres" password="geheim" />
我的无效代码:
@Override
public void insertArrayUserV2Voidv2(ArrayList<UserV2> users) {
String insertTableSQL = "INSERT INTO RANK (account, rank, date) VALUES (?,?, to_timestamp(?, 'YYYY-MM-DD\"T\"HH24:MI:SS.ff3\"Z\"'))";
try (Connection conn = baseDao.getConnection();
PreparedStatement preparedStmt = conn.prepareStatement(insertTableSQL);) {
for (UserV2 u : users) {
preparedStmt.setString(1, u.getAccount());
preparedStmt.setString(2, u.getRank());
preparedStmt.setString(3, u.getJoined());
preparedStmt.addBatch();
System.out.println(preparedStmt);
}
System.out.println(conn.getClientInfo());
preparedStmt.executeBatch();
} catch (SQLException e) {
if (e.getErrorCode() == 0) {
} else
throw new WebApplicationException(e.getMessage(), Response.Status.CONFLICT);
}
}
和我以前的工作代码:
@Override
public void insertArrayUserV2Void(ArrayList<UserV2> users) {
String insertTableSQL = "INSERT INTO RANK (account, rank, date) VALUES (?,?, to_timestamp(?, 'YYYY-MM-DD\"T\"HH24:MI:SS.ff3\"Z\"'))";
for (UserV2 u : users) {
try (Connection conn = baseDao.getConnection();
PreparedStatement preparedStmt = conn.prepareStatement(insertTableSQL);) {
preparedStmt.setString(1, u.getAccount());
preparedStmt.setString(2, u.getRank());
preparedStmt.setString(3, u.getJoined());
preparedStmt.execute();
} catch (SQLException e) {
if (e.getErrorCode() == 0) {
} else
throw new WebApplicationException(e.getMessage(), Response.Status.CONFLICT);
}
}
}
预期结果将是在1次调用中出现+/- 250条插入语句,即使PK对其中1条抛出错误,该语句也会尝试插入所有行。
答案 0 :(得分:0)
实际上它正在工作,我只是从未注意到错误原因,因为我没有任何通知就将其过滤掉了(愚蠢的我)
还将查询更改为: 字符串insertTableSQL =“将行插入(帐户,排名,日期)值(?,?,to_timestamp(?,'YYYY-MM-DD \” T \“ HH24:MI:SS.ff3 \” Z \“'))在冲突中不要“;这样就不会在PK的第一个重复项上引发错误...