2016-06-13 106 views
3

最も簡単なクエリです。MyBatis SELECTがJDBCよりも遅い理由

マイ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必要です。

私は、session.selectList、session.select、およびsession.selectCursorを使用する代わりにマッパーの使用を避けようとしましたが、MaBatis.Mapperよりも明らかに優れたパフォーマンスはありません。

MyBatisのパフォーマンスを向上させるにはどうすればよいですか?コードの下で述べたように

+0

上記の例では、2つの異なるSQL要求があります。同じリクエストを比較しようとしましたか? –

+0

私はvideo.id、videos.connector_id、videos.season_numberを選択してみました。ビデオからどこのconnector_type = 'show'; JDBCでは、10ミリ秒未満しかかかりません(最初のクエリを除外します) – Cuero

答えて

2

はあなたのクエリにフェッチサイズを定義します。あなたは、レコードの1000を持っている場合、それは本当に遅います

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

デフォルトfetch size in jdbc for oracle is 10sql developer it is 50では。したがって、その場合は、要件に応じて適切なフェッチサイズを定義する必要があります。

+1

ありがとうございます。上記の簡単なクエリではそれほど役に立ちませんが、複雑なクエリの場合、時間コストは80〜100msから75ms未満に短縮されます。しかし、それはまだJDBCよりもはるかに遅いです。 – Cuero

+0

いずれにしても、いつでもフェッチサイズを増やすことができます。データベーステーブルのインデックスを作成すると、パフォーマンスが向上します。 – SiddP

+0

しかし、なぜJDBCとMyBatisの間にパフォーマンスのギャップがあるのでしょうか? –

関連する問題