我有一份预先准备好的声明,上面有六点?在里面。在任何地方,它都将被相同的字符串取代。
以下两种方法中哪一种更可取:
pstmt = con.prepareStatement(QUERY.replaceAll("\\?", id));或
pstmt = con.prepareStatement(QUERY));
pstmt.setString(1, id);
pstmt.setString(2, id);
pstmt.setString(3, id);
pstmt.setString(4, id);
pstmt.setString(5, id);
pstmt.setString(6, id);发布于 2014-08-21 13:42:14
第二种,第一种可能容易受到SQL注入的影响。特别是当id是一个String时(它看起来就在这里)。
pstmt = con.prepareStatement(QUERY));
pstmt.setString(1, id);
pstmt.setString(2, id);
pstmt.setString(3, id);
pstmt.setString(4, id);
pstmt.setString(5, id);
pstmt.setString(6, id);另外,由于语句查询缓存可能会将语句重用到不同的id(s),所以上面的操作应该更好。第一个例子并非如此。
发布于 2014-08-21 13:43:36
第二个。
除了难以识别的错误(例如用it替换字符串文本中的问号)之外,每次发送第一个查询时都需要对第一个查询进行分析和优化。这将使查询计划的缓存受到几乎相同的计划的污染,这些计划仅在ID的确切值上存在差异。每次解析查询都会增加额外的成本,使缓存变得毫无用处。
第二次将准备一次,每次执行时都会重用它的查询计划。
https://stackoverflow.com/questions/25427880
复制相似问题