이 질문에 대한 모든 대답을 따라- Statement
(하지만 SQL 인젝션 사용)을 사용하여 작동하는 레거시 코드를 & PreparedStatement
주위의 의미에 대한 이해가 부족하기 때문에 훨씬 느린 코드로 사용하는 솔루션 으로 변경했습니다 .Statement.addBatch(String sql)
PreparedStatement.addBatch()
그래서 나는 다른 사람들이 같은 실수를하지 않도록 시나리오를 여기에 나열하고 있습니다.
내 시나리오는
Statement statement = connection.createStatement();
for (Object object : objectList) {
//Create a query which would be different for each object
// Add this query to statement for batch using - statement.addBatch(query);
}
statement.executeBatch();
따라서 위의 코드에서 수천 개의 서로 다른 쿼리가 있었으며 모두 동일한 문에 추가되었으며 캐시되지 않은 문이 좋았 으며이 코드는 앱에서 거의 실행되지 않았기 때문에이 코드가 더 빠르게 작동했습니다.
이제 SQL 인젝션을 수정하기 위해이 코드를로 변경했습니다.
List<PreparedStatement> pStatements = new ArrayList<>();
for (Object object : objectList) {
//Create a query which would be different for each object
PreparedStatement pStatement =connection.prepareStatement(query);
// This query can't be added to batch because its a different query so I used list.
//Set parameter to pStatement using object
pStatements.add(pStatement);
}// Object loop
// In place of statement.executeBatch(); , I had to loop around the list & execute each update separately
for (PreparedStatement ps : pStatements) {
ps.executeUpdate();
}
그래서 당신은 수천 개의 PreparedStatement
객체를 만들기 시작했고 결국 시나리오를 요구했기 때문에 일괄 처리를 사용할 수 없었습니다. 수천 개의 UPDATE 또는 INSERT 쿼리가 있으며 이러한 쿼리는 모두 다릅니다.
성능 저하 비용없이 SQL 삽입 수정이 필수이며이 PreparedStatement
시나리오에서는 가능하지 않다고 생각합니다 .
또한 내장 된 일괄 처리 기능을 사용하는 경우 하나의 명령문 만 닫는 것에 대해 걱정해야하지만이리스트 방식을 사용하면 재사용하기 전에 명령문을 닫아야합니다 . PreparedStatement 재사용