Java 哪种方法的性能更好?(关于JDBC中prepared语句中可变参数标记的用法)

Java 哪种方法的性能更好?(关于JDBC中prepared语句中可变参数标记的用法),java,performance,jdbc,prepared-statement,Java,Performance,Jdbc,Prepared Statement,我的目标是从Emp表中获取某些员工的部门名称。但是雇员的数量是不同的。请说明以下方法是否正确,以及以下哪种方法在性能方面更好。还是有更好的办法 PreparedStatement pstmt = conn.prepareStatement("SELECT Dept from Emp WHERE EmpNum = ? "); for (int i = 0, len = empNumberList.size(); i < len; i++) { pstmt.setLong

我的目标是从Emp表中获取某些员工的部门名称。但是雇员的数量是不同的。请说明以下方法是否正确,以及以下哪种方法在性能方面更好。还是有更好的办法

PreparedStatement pstmt = conn.prepareStatement("SELECT Dept from Emp WHERE EmpNum = ? ");
    for (int i = 0, len = empNumberList.size(); i < len; i++) {
      pstmt.setLong (1, empNumberList.get(i));
      ResultSet rs = pstmt.executeQuery();
    }
PreparedStatement pstmt=conn.prepareStatement(“从Emp中选择部门,其中EmpNum=?”;
for(int i=0,len=empNumberList.size();i

StringBuffer buffer = new StringBuffer();
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?");
for (int i = 0, len = empNumberList.size(); i < len; i++) {
  buffer.append(",?");
}
buffer.append(")");
PreparedStatement pstmt = con.prepareStatement(buffer.toString());
for(int i = 0; i < len; i++) {
pstmt .setLong(i, empNumberList.get(i));
}
ResultSet rs = pstmt .executeQuery();
StringBuffer=new StringBuffer();
append(“从Emp中选择Dept,其中EmpNum在(?);
for(int i=0,len=empNumberList.size();i
或者还有其他更好的方法吗?请给我一些建议。提前谢谢

拉维拉

我会说

“选择Emp中EmpNum所在的不同部门(“+queries+”)”


然后执行setLong()将是最好的方法,也可能是最好的性能,但确保性能的唯一方法是对其进行分析。

一般来说,执行一个查询胜过执行多个查询,因为在大多数(琐碎的)查询中,服务器往返被视为一项巨大的成本

也就是说,数据库供应商、JDBC或驱动程序可能会限制以这种方式传递的参数数量,因此您必须对此保持警惕


就像另一张海报上说的:没有必要对客户进行过滤。在这种情况下只需使用DISTINCT。

可能是第二种选择,因为通常数据库查询需要更多时间

此外,您的代码中有一个bug:

StringBuffer buffer = new StringBuffer();
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?");
for (int i = 1, len = empNumberList.size(); i < len; i++) { // one ? was written
  buffer.append(",?");
}
buffer.append(")");
PreparedStatement pstmt = con.prepareStatement(buffer.toString());
for(int i = 0; i < len; i++) {
pstmt .setLong(i+1, empNumberList.get(i)); // pstmt setXXX() are 1 based
}
ResultSet rs = pstmt .executeQuery();
StringBuffer=new StringBuffer();
append(“从Emp中选择Dept,其中EmpNum在(?);
为(inti=1,len=empNumberList.size();i
我同意第二个可能更快的估计

然而,如果您真的想知道:基准测试。性能结果通常是不直观的,并且在平台、数据库、体系结构和版本之间会有所不同。所以,你自己试试看,并测量差异