ResultSetExtractor中使用getInt存在性能问题

6

我在ResultSetExtractor中调用getInt时遇到了性能问题。GetInt被调用了20000次。一次调用耗费0.15毫秒,总成本为24秒,在分析器内运行。执行SQL语句大约需要8秒钟(通过主键访问)。我使用的是mysql驱动程序版本5.1.13,mysql服务器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 方法,这似乎很耗费资源。是否可以关闭这些检查?

2个回答

2
以下是一些建议:
  • 设置较大的获取大小:Statement.setFetchSize()。这应该会减少处理结果集时与数据库服务器的往返次数。

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

  • 进行常规表优化,例如是否使用了正确的数据类型?看起来你可以将leffect_a更改为BOOLEAN类型

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

  • 使用PreparedStatement

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


0

两个建议:

  1. getMutEffect()getMutReliability() 的结果存储在本地变量中,因为它们会被重复使用。热点 JIT 可能会内联和删除重复表达式,但我认为不依赖于此更清晰。
  2. 使用索引而不是列名检索 ResultSet 的值可能会更快。您甚至可以创建一个本地名称到索引的映射,对于某些 JDBC 驱动程序来说,这比让 ResultSet 进行映射更快奇怪。

谢谢你的回答。分析器显示将列名映射到索引是廉价的。而且访问getMutEffect也没有性能问题。 - martin s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接