Hibernate, JDBC and Java performance on medium and big result set

前端 未结 1 1984
心在旅途
心在旅途 2020-12-13 15:08

Issue

We are trying to optimize our dataserver application. It stores stocks and quotes over a mysql database. And we are not satisfied with the fetching performan

相关标签:
1条回答
  • 2020-12-13 15:33

    Can you do a smoke test with the simples query possible like:

    SELECT current_timestamp()
    

    or

    SELECT 1 + 1
    

    This will tell you what is the actual JDBC driver overhead. Also it is not clear whether both tests are performed from the same machine.

    Is there a way to optimize the performance of JDBC driver ?

    Run the same query several thousand times in Java. JVM needs some time to warm-up (class-loading, JIT). Also I assume SimpleJDBC.getConnection() uses C3P0 connection pooling - the cost of establishing a connection is pretty high so first few execution could be slow.

    Also prefer named queries to ad-hoc querying or criteria query.

    And will Hibernate benefit this optimization ?

    Hibernate is a very complex framework. As you can see it consumes 75% of the overall execution time compared to raw JDBC. If you need raw ORM (no lazy-loading, dirty checking, advanced caching), consider mybatis. Or maybe even JdbcTemplate with RowMapper abstraction.

    Is there a way to optimize Hibernate performance when converting result sets ?

    Not really. Check out the Chapter 19. Improving performance in Hibernate documentation. There is a lot of reflection happening out there + class generation. Once again, Hibernate might not be a best solution when you want to squeeze every millisecond from your database.

    However it is a good choice when you want to increase the overall user experience due to extensive caching support. Check out the performance doc again. It mostly talks about caching. There is a first level cache, second level cache, query cache... This is the place where Hibernate might actually outperform simple JDBC - it can cache a lot in a ways you could not even imagine. On the other hand - poor cache configuration would lead to even slower setup.

    Check out: Caching with Hibernate + Spring - some Questions!

    Are we facing something not tunable because of Java fundamental object and memory management ?

    JVM (especially in server configuration) is quite fast. Object creation on the heap is as fast as on the stack in e.g. C, garbage collection has been greatly optimized. I don't think the Java version running plain JDBC would be much slower compared to more native connection. That's why I suggested few improvements in your benchmark.

    Are we missing a point, are we stupid and all of this is vain ?

    I believe that JDBC is a good choice if performance is your biggest issue. Java has been used successfully in a lot of database-heavy applications.

    0 讨论(0)
提交回复
热议问题