为什么 MyBatis SELECT 比 JDBC 慢

Cue*_*ero 5 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));
}
Run Code Online (Sandbox Code Playgroud)

而 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));
}
Run Code Online (Sandbox Code Playgroud)

不考虑第一次查询,对于后面的查询,JDBC总是在6ms~10ms左右,MyBatis在31~35ms左右,大约是3倍。

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

我试图避免使用映射器,而是使用 session.selectList、session.select 和 session.selectCursor,但没有一个比 MaBatis.Mapper 有明显更好的性能。

如何提高 MyBatis 的性能?

Sid*_*ddP 2

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

<select id="queryTest" fetchSize="1000" resultType="map">
Run Code Online (Sandbox Code Playgroud)

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