ORM性能測試框架和測試結果 頂 原

BeetlSQL 是我這倆年和小夥伴們研發的一個開源全功能ORM工具,強調快速開發,高效維護,能真正跨數據庫平臺,支持分庫分表等功能。從這個鏈接可以看到關於我對BeetlSQL的一個總結:5分鐘 BeetlSQL 快速入門

一直有朋友想了解一下BeetlSQL跟Myabtis,Hiberante功能區別,因此我寫了個博客總結了一下,從這裏可以看到:hibernate,mybatis,beetlsql 全面比較

最近也有人問過性能上的差別,我一直沒有去做這塊,主要感覺ORM性能好壞在系統不佔主要地位,工具主要瓶頸還是在數據庫優化。不過還是昨天在小夥伴幫助下,初步完成了一個性能測試,測試結果如下

輸入圖片說明

可以從 我的碼雲上獲得整個測試代碼和測試結果:https://gitee.com/xiandafu/dao-benchmark

測試總結

從測試結果來看,JDBC無疑是最快的,比JPA和MyBatis高一個數量級,幾倍於BeetlSQL。 但ORM工具中(也是本次測試的目的),BeetlSQL非常快,基本上都是好幾倍於其他工具,比如

  • testAdd, BeetlSQL是JPA的7倍,是MyBatis的3倍
  • testUnique BeetlSQL是JPA的4倍,是MyBatis的3倍
  • testUpdateById ,BeetlSQL 比JPA快一些,比Mybatis快3倍
  • testPageQuery,BeetlSQL是JPA的3倍,是MyBatis的約5倍
  • testExample,BeetlSQL是JPA的7倍,是MyBatis的約4倍

如何測試

  • git clone https://gitee.com/xiandafu/dao-benchmark
  • mvn clean package
  • java -jar -Dtest.target=jpa target/dao-0.0.1-SNAPSHOT.jar 測試目標可更換爲jpa,beetlsql,mybatis,jdbc
  • 在result目錄檢測測試文本結果

測試過程

整個系統基於SpringBoot,因此同時集成了JDBC,BeetlSQL,JPA(Spring Data),MyBatis 四種數據庫訪問方式,並通過配置來說明測試目標

test:
    count: 1000
    target: mybatis
    warmCount: 20

所以測試都是單獨JVM完成,預熱20次,然後測試1000次。測試完畢,JVM應用停掉。 爲了保證數據庫對測試結果影響最小,使用了H2的內存數據庫

spring:
    datasource:
        driver-class-name: org.h2.Driver
        password: ''
        schema: classpath:db/schema.sql
        url: jdbc:h2:mem:dbtest;DB_CLOSE_ON_EXIT=FALSE
        username: sa

每個Dao工具都必須實現一個測試接口,並註冊到SpringBoot裏

@Configuration
public class TestServiceConfig {
    @Bean
    @ConditionalOnProperty(name = "test.target", havingValue = "beetlsql")
    public TestServiceInterface getBeetlSqlTestService() {
        return new BeetlSqlPerformaceTestService();
    }


    @Bean
    @ConditionalOnProperty(name = "test.target", havingValue = "jpa")
    public TestServiceInterface getJpaTestService() {
        return new JpaPerformaceTestService();
    }

    @Bean
    @ConditionalOnProperty(name = "test.target", havingValue = "mybatis")
    public TestServiceInterface getMyBatisTestService() {
        return new MyBatisPerformanceTestService();
    }
    
    @Bean
    @ConditionalOnProperty(name = "test.target", havingValue = "jdbc")
    public TestServiceInterface getRawJDBCTestService() {
        return new RawJDBCPerformaceTestService();
    }

}

如果你對如何完成這些測試有疑惑,可以閱讀這些源碼,看看測試是否需要改進:)

測試結果在控制檯打印出來,並同時記錄結果到result目錄下

輸入圖片說明

我是手工將這些數據錄入excel表格並導出到統計圖裏。

BeetlSQL 是一個ORM工具,其中SQL管理和SQL模板是基於Beetl技術,順便也貼一下Beetl的性能測試,這個一直都是非常高性能,全功能的模板語言

輸入圖片說明,如果你對BeetlSQL和Beetl有興趣,可以訪問Ibeetl.com 瞭解有哪些國內大廠使用過,以及使用手冊和DEMO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章