我有一个脚本可以获取大约25.000个不同的ID值,并使用它们在其他表中进行一些更改。但是程序员创建了这个代码,它通过1000万条记录表(第3行)搜索ID(代码中的dialid),循环中的每个查询都在1秒左右执行。我的想法是使用SQL获取最近30天的记录并将其放入一个数组并仅检查数组。
我的问题是,如何用Java做到这一点?是in_array函数吗?我在PHP方面很扎实,但在Java代码中初学者......
private Integer getDialId(int predictiveId) {
Integer dialid = null;
StringBuilder sql = new StringBuilder("SELECT dialid from dial where PREDICTIVE_DIALID=");
sql.append(predictiveId); //this predictiveId is calculated in other part of code
ResultSet rsDialId = null;
Statement s1 = null;
try {
s1 = oracle.getConn().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT);
rsDialId = s1.executeQuery(String.valueOf(sql));
if (rsDialId.next()) {
dialid = rsDialId.getInt("dialid");
}
} catch (SQLException ex) {
Logger.getLogger(MediatelCdrSync.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
if (s1 != null) {
s1.close();
}
if (rsDialId != null) {
rsDialId.close();
}
} catch (SQLException ex) {
Logger.getLogger(MediatelCdrSync.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("DIALID = " + dialid);
return dialid;
}
日Thnx
答案 0 :(得分:0)
如果遇到性能问题,我会开始明白为什么查询每次执行需要一秒钟,如果是数据库时间,因为拨号表没有,并且在PREDICTIVE_DIALID列上有索引,那么在java级别可以做很少的事情。 无论如何,jdbc代码揭示了一些问题,尤其是与oracle数据库一起使用时。 最大的问题是您正在硬编码查询参数,导致Oracle每次都“重新解析”查询;第二个(次要的)是结果集是可滚动和可更新的,而您只需要加载第一行。如果你想对你的代码做一些修改,你应该改成像这样的伪代码:
PreparedStatement ps =connection.prepareStatement("SELECT dialid from dial where PREDICTIVE_DIALID=?");
for (int i=0;i<10;i++) {//your 25000 loop elements is this one
//this shoudl be the start of the body of your getDialId function that takes also a prepared statement
ps.setInt(1, i);
ResultSet rs=ps.executeQuery();
if (rs.next()) {
rs.getInt("dialid");
}
rs.close();
//your getDialId end here
}
ps.close();
使用这个最小的java解决方案,你应该注意到性能提升,但你必须削弱单个查询的性能,因为如果缺少索引,你很难对java代码产生影响。
另一个更复杂的解决方案是创建一个temporart表,用所有25000个predictiveId值填充它,然后发出一个连接dial和你临时表的查询;所以使用一个结果集(和一个查询),您可以找到所需的所有拨号。临时表中的jdbc批量插入可显着加快插入时间。
答案 1 :(得分:0)
如果您打算获取更少的记录并将结果存储在某个阵列中,那么就是 我认为最好通过在数据库中创建一个有限记录的视图来限制搜索(比如说最近2年的记录) 并在选择查询中使用该视图
"SELECT dialid from dial_view WHERE PREDICTIVE_DIALID = "
希望它会有所帮助:)