ResultSetExtractor中getInt的性能问题

时间:2012-04-09 19:37:24

标签: java mysql performance spring jdbc

我在ResultSetExtractor中调用getInt会遇到性能问题。 GetInt被称为20000次。一次通话费用为0.15毫秒,总体成本为24秒,同时在探查器内部运行。执行SQL语句大约需要8秒钟(通过Primary-Key访问)。我使用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中调用了methode getIntWithOverflowCheck,这看起来很昂贵。是否有可能完成这项检查?

2 个答案:

答案 0 :(得分:2)

以下是一些建议:

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

  • 通过分析

  • 确保select语句最佳
  • 一般表格优化,例如你使用正确的数据类型?看起来您可以将leffect_a更改为BOOLEAN

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

  • 使用PreparedStatement

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

答案 1 :(得分:0)

两个建议:

  1. getMutEffect()getMutReliability()的结果存储在重复使用的局部变量中。热点jit可能会内联并删除重复的表达式,但我认为更清楚的是不依赖于此。
  2. 使用indizes而不是列名检索ResultSet的值可能会更快。你甚至可以创建一个名称的本地地图来索引,奇怪的是对于一些jdbc驱动程序,这比让ResultSet进行映射要快。