6

我在 ResultSetExtractor 中调用 getInt 时遇到性能问题。GetInt 被调用 20000 次。一次调用花费 0.15 毫秒,总花费为 24 秒,同时在分析器内部运行。SQL 语句的执行大约需要 8 秒(通过主键访问)。我用的mysql驱动版本5.1.13,mysql server 5.1.44和spring-jdbc-3.1.1你有提高性能的想法吗?

    mut.getMutEffect()[0]=(rs.getInt("leffect_a") != 0);
    mut.getMutEffect()[1]=(rs.getInt("leffect_c") != 0);
    ...
    mut.getMutEffect()[19]=(rs.getInt("leffect_y") != 0);
    mut.getMutReliability()[0]=rs.getInt("lreliability_a");
    ...
    mut.getMutReliability()[19]=rs.getInt("lreliability_y");

我的方案看起来像这样

CREATE TABLE mutation (
 ...
 leffect_a BIT NOT NULL,
 lreliability_a TINYINT UNSIGNED NOT NULL,
 ...
 leffect_y BIT NOT NULL,
 lreliability_y TINYINT UNSIGNED NOT NULL,
 ...
) ENGINE=MyISAM;

编辑:在 getInt 中调用 getIntWithOverflowCheck 方法,这似乎很昂贵。是否可以关闭此检查?

4

2 回答 2

2

以下是一些建议:

  • 将获取大小设置为一个相当大的数字:Statement.setFetchSize()。这应该会减少处理结果集时到数据库服务器的往返次数。

  • 通过分析确保选择语句是最佳的

  • 一般表优化,例如,您是否使用正确的数据类型?看起来您可以将 leffect_a 更改为 BOOLEAN

  • 确保您没有在 SELECT 语句中返回任何不必要的列。

  • 使用PreparedStatement

  • 避免可滚动和可更新的结果集(都不是默认的)

于 2012-04-09T20:23:27.310 回答
0

两个建议:

  1. getMutEffect()将和的结果存储getMutReliability()在局部变量中,因为它们被重复使用。热点 jit 可能会内联并删除重复的表达式,但我认为不依赖它更清楚。
  2. 使用它们的 indizes 而不是列名来检索 ResultSet 的值可能会更快。您甚至可以创建要索引的名称的本地映射,奇怪的是对于某些 jdbc 驱动程序,这比让 ResultSet 进行映射要快。
于 2012-04-09T19:50:42.883 回答