最简单的查询。
我的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的性能?
答案 0 :(得分:2)
为查询定义提取大小,如下面的代码所示:
<select id="queryTest" fetchSize="1000" resultType="map">
默认fetch size in jdbc for oracle is 10
和sql developer it is 50
,如果你有1000条记录,它会非常慢。因此,在这种情况下,您需要根据您的要求定义合适的提取大小。