Java,使用数组而不是SQL SELECT

时间:2015-07-10 07:27:46

标签: java sql arrays oracle long-integer

我有一个脚本可以获取大约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

2 个答案:

答案 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 = "

希望它会有所帮助:)