&に関するセマンティクスの理解が不十分なため、- 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
、このシナリオではそれが可能であるとは思いません。
また、組み込みのバッチ機能を使用する場合は、ステートメントを1つだけ閉じることを心配する必要がありますが、このリストアプローチでは、再利用する前にステートメントを閉じる必要があります。PreparedStatementの再利用