为什么MyBatis SELECT比JDBC慢

时间:2016-06-13 05:33:19

标签: java mysql jdbc mybatis

最简单的查询。

我的JDBC代码是这样的:

String sql = "SELECT videos.id, videos.connector_id, videos.season_number FROM videos WHERE videos.connector_type = 'show';";
System.out.println("Create statement...");
Scanner scanner = new Scanner(System.in);
while (true) {
    int input = scanner.nextInt();
    long start = System.nanoTime();
    stmt = conn.prepareStatement(sql);
    ResultSet resultSet = stmt.executeQuery();
    System.out.println("Time 1: " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
}

MyBatis代码是这样的:

<select id="queryTest" resultType="map">
SELECT videos.id, videos.connector_id, videos.season_number FROM videos WHERE connector_type = 'show';
</select>

try (SqlSession session = DatabaseConnFactory.getSqlSession()) {
    start = System.nanoTime();
    maps = session.selectList("queryTest", parameterWrapper);
    System.out.println("Time 1: " + TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
}

不考虑第一个查询,对于以下查询,JDBC总是需要大约6ms~10ms,而MyBatis需要大约31~35ms,大约是3次。

对于更复杂的查询(6个内连接和其中的顺序),JDBC只需要25~30ms,而MyBatis需要80~100ms。

我试图避免使用mapper,而是使用session.selectList,session.select和session.selectCursor,但它们都没有明显比MaBatis.Mapper更好的性能。

如何改善MyBatis的性能?

1 个答案:

答案 0 :(得分:2)

为查询定义提取大小,如下面的代码所示:

<select id="queryTest" fetchSize="1000" resultType="map">

默认fetch size in jdbc for oracle is 10sql developer it is 50,如果你有1000条记录,它会非常慢。因此,在这种情况下,您需要根据您的要求定义合适的提取大小。