【问题标题】:Java / PostgreSQL - Data Optimization for PerformanceJava / PostgreSQL - 性能数据优化
【发布时间】:2013-05-08 08:36:35
【问题描述】:

已经有一段时间了。我目前正在努力优化我的应用程序的性能。这是一个与我目前拥有的类似的 sn-p。

带有此查询的存储过程:

SELECT field_a, field_b, field_c
FROM table_a
WHERE field_a = param_a
AND field_b = param_b;

在 Java 中,我有 SampleParameterClassArrayListparamAparamB 的属性声明为 String

ArrayList<SampleParameterClass> sampleParams = new ArrayList<SampleParameterClass>();

sampleParams.add(new SampleParameterClass(stringValueForParamA, stringValueForParamB);

假设sampleParams 由数百个元素组成。

try
    {
        conn = ConnectionPool.getConnection();

        con.setAutoCommit(false);

        CallableStatement myProcedure = connection.prepareCall("{ ? = call my_proc_name(?, ?) }");

        for(int paramCounter = 0; paramCounter < sampleParams.size(); paramCounter ++){

            myProcedure.registerOutParameter(1, Types.OTHER);
            myProcedure.setObject(2, sampleParams.get(paramCounter).getParamA);
            myProcedure.setObject(3, sampleParams.get(paramCounter).getParamB);
            myProcedure.execute();

            ResultSet rs = (ResultSet) myProcedure.getObject(1);

            while (rs.next()) {

                String resultA = rs.getString("param_a");
                String resultB = rs.getString("param_b");
                String resultC = rs.getString("param_c");

                myArrayListOfResult.add(new Result(resultA, resultB, resultC);

            }
        }

    }
    catch (SQLException e) {
        myProcedure.close();
        conn.close();
    }
}

基本上,上面的代码所做的就是循环遍历ArrayList 中的所有参数,并为每个参数调用存储过程。如果我有成千上万的数据要处理,它会像蜗牛一样慢,不是吗?

我的问题是:
1) 即使队列中有数千个参数,是否可以只调用一次程序?类似于传递整个 ArrayList 参数的东西。
2) 如果上述问题无法回答,有什么方法可以最小化这个过程吗?

注意:
- 带有INSERT 语句的过程的相同问题。
- 如果我错过了什么,我还没有找到与此类似的问题。请务必发布该问题的 URL,我会将其标记为该问题的答案。
- 我还没有找到像在程序中传递列表这样的阅读材料。

谢谢,非常感谢任何答案。

【问题讨论】:

  • 在您所写的内容中,我看不出有任何理由将其作为存储过程。你可以使用普通的PreparedStatement,可能会让你的生活更轻松。
  • 谢谢汤姆。上面写的存储过程是为了我的问题。目前,该过程实际上至少包括8个表。另一方面,关于你的建议,那不是和程序一样吗?还会根据我的 sampleParams 中的元素数量调用查询?
  • 你是对的,使用PreparedStatement 并不能解决这个问题。但 user2310289 的回答给出了一个适用于 CallableStatementPreparedStatement 的解决方案。
  • 谢谢汤姆!我目前正在努力。完成后,我会标记他的答案。

标签: java postgresql optimization stored-procedures parameter-passing


【解决方案1】:

为什么不将参数作为分隔字符串传递,然后在 postgresql 端使用 string_to_array(text, text [, text]) 将字符串转换为数组。

http://www.postgresql.org/docs/9.1/static/functions-array.html

Postgres integer arrays as parameters?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多