国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Mybatis與Jpa的區別和性能對比總結

瀏覽:16日期:2023-10-19 07:02:22
前言

這幾天聽朋友說JPA很好用,根本不用寫sql。我在想一個程序員不寫sql還能叫程序員?而且越高級的工具封裝越多的工具,可拓展性和效率就非常的低,況且我本身非常不喜歡過于封裝的東西,平時喜歡手寫sql,所以一直都是用mybatis去寫業務。然后發現jpa的saveAll()批量插入批量更新速度太慢了,導致一些用excel導入的一些東西非常慢,弄得原本同步可以解決的事情每次導入都要開啟一個異步,個人感覺這種做法非常不好。因為異步其實就是對當前的業務不影響去另外的時間段去做,例如跑定時任務,異步更新增量信息等。代碼里非常多異步包異步的東西,也就是說excel導入是異步,然后jpa又慢,異步里面又包涵異步,整個鏈路非常長,可能發生問題都要排查半天。

安裝jpa和mybatis

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

這些東西只要引入一個springboot的xml作為父類就行

創建一個類

@Datapublic class TestMybatis { private Long id; /** * 域賬號 */ private String userId; /** * 主度量 */ private String mainMetric; /** * 子度量 */ private String subMetric; /** * 度量條目 */ private String metricItem;}@SuppressWarnings('serial')@[email protected](name = 'test')@lombok.Datapublic class TestJpa { @javax.persistence.Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 域賬號 */ private String userId; /** * 主度量 */ private String mainMetric; /** * 子度量 */ private String subMetric; /** * 度量條目 */ private String metricItem;}/** * @author Kakki * @version 1.0 * @create 2021-06-17 17:39 * 這個是用來Jpa跟Mapper差不多 */@Repositorypublic interface TestRee extends JpaRepository<TestRe, String> {}

這是mybatis的xml

<insert id='insertList'> insert into test(user_id,main_metric, sub_metric, metric_item) values <foreach collection='param' item='item' separator=','> (#{item.userId}, #{item.mainMetric}, #{item.subMetric}, #{item.metricItem}) </foreach></insert>

下面我們來看看速度

@Slf4j@RunWith(SpringRunner.class)@SpringBootTest(classes = {ColaDemoApplication.class})class ColaDemoApplicationTests { @Autowired private TestRee testRee; @Autowired private MetricMapper metricMapper; @Test void contextLoads() {List<TestJpa> jpaList = new ArrayList<>(1000);List<com.kakki.colademo.gatewayimpl.database.dataobject.TestMybatis> mybatisList = new ArrayList<>(1000);for (int i = 0; i < 1000; i++) { TestJpa testJpa = new TestJpa(); testJpa.setMainMetric(String.format('mainMetric%d', i)); testJpa.setSubMetric(String.format('subMetric%d', i)); testJpa.setUserId(String.format('userId%d', i)); testJpa.setMetricItem(String.format('metricItem%d', i)); jpaList.add(testRe); com.kakki.colademo.gatewayimpl.database.dataobject.TestMybatis testMybatis = new com.kakki.colademo.gatewayimpl.database.dataobject.TestMybatis(); testMybatis.setMainMetric(String.format('mainMetric%d', i)); testMybatis.setSubMetric(String.format('subMetric%d', i)); testMybatis.setUserId(String.format('userId%d', i)); testMybatis.setMetricItem(String.format('metricItem%d', i)); mybatisList.add(testR);}StopWatch jpa = new StopWatch();jpa.start();testRee.saveAll(jpaList);jpa.stop();log.info('[jpa]{}ms', jpa.getTotalTimeMillis());StopWatch m = new StopWatch();m.start();metricMapper.insertList(mybatisList);m.stop();log.info('[m]{}ms', m.getTotalTimeMillis()); }}

22:35:10.708 [main] INFO c.e.c.ColaDemoApplicationTests - [jpa]10576ms22:35:31.366 [main] INFO c.e.c.ColaDemoApplicationTests - [m]138ms

可以說相差差不多10倍了吧?這僅僅只是1000條數據。讓我們試試10000條

22:36:48.505 [main] INFO c.e.c.ColaDemoApplicationTests - [jpa]8081ms22:37:05.005 [main] INFO c.e.c.ColaDemoApplicationTests - [m]613ms# 再試試10w條22:38:49.085 [main] INFO c.e.c.ColaDemoApplicationTests - [jpa]65710ms22:39:09.844 [main] INFO c.e.c.ColaDemoApplicationTests - [m]9448ms

那么這樣能看出來很大的差距了吧?為什么會差距這么大呢?我們看看saveAll()源碼

@Transactional@Overridepublic <S extends T> List<S> saveAll(Iterable<S> entities) {Assert.notNull(entities, 'Entities must not be null!');List<S> result = new ArrayList<S>();for (S entity : entities) {result.add(save(entity));}return result;} @Transactional@Overridepublic <S extends T> S save(S entity) {if (entityInformation.isNew(entity)) {em.persist(entity);return entity;} else {return em.merge(entity);}}

從上面可以看出來是一條條save進去的并且save里面還會去判斷這個主鍵是否為空也就是說n條循環n條if判斷,那樣性能肯定是衰減得非常多的拉

結論

我在網上看到加入以下這些參數可以變成批量的,但是筆者試過根本沒用,可能想要解決這個問題,需要重寫他的saveAll()方法然后分片去插入或者更新這樣性能會好很多。

spring.jpa.properties.hibernate.jdbc.batch_size=10000spring.jpa.properties.hibernate.jdbc.batch_versioned_data=truespring.jpa.properties.hibernate.order_inserts=truespring.jpa.properties.hibernate.order_updates=true

當然今天我僅僅是用jpa的性能跟mybatis比較,但是作為一個碼農深知,技術是為業務服務的。Jpa當然也有他的好處,例如創建一些方法findAllByIdIn(List ids)就可以直接獲取到以這個條件查詢的列表,還有findAllByOrderIdAndOrderType(String orderId, String orderType)這種一樣也可以,可以說非常的方便,也不需要再去寫sql,他會全自動的完成你的查詢操作。

小結

開發一個小型項目,Jpa效率肯定是比Mybatis高的,但是因為業務需求迭代更新越來越快,Jpa明顯是滿足不了很多東西,而且維護起來看Sql也是比MyBatis難。所以我更偏向于Mybatis,寫的Sql也更加簡潔更容易維護。

到此這篇關于Mybatis與Jpa的區別和性能對比的文章就介紹到這了,更多相關Mybatis與Jpa區別和性能內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 久久免费视频在线观看 | 99免费精品 | 91手机看片国产福利精品 | 九色91 | 免费一级a毛片在线播放 | 国产成人综合95精品视频免费 | 在线播放精品 | 色视频www在线播放国产人成 | 中文偷拍视频在线观看 | 日本免费在线观看视频 | 各种偷拍盗摄视频在线观看 | 国产一级aaaaa毛片欧美 | 欧美13一14周岁a在线播放 | 一级国产在线观看高清 | 国产免费人视频在线观看免费 | 曰本美女高清在线观看免费 | 国产在线更新 | 九九久久视频 | 日本在线视频观看 | 国产成人精品视频免费大全 | 久久精品99精品免费观看 | 亚洲影视一区二区 | 一区 在线播放 | 日本 片 成人 在线 日本68xxxxxxxxx老师 | 国产精品成人久久久久久久 | 香蕉久久久久久狠狠色 | 狠狠做久久深爱婷婷97动漫 | 国产国产人免费视频成69堂 | 国产二区自拍 | 国产精品自拍在线 | 欧美一级特黄一片免费 | 成年女人毛片免费观看中文w | 精品毛片 | 久久精品免视看国产明星 | 久色福利 | 久热国产在线视频 | 国产美女一级毛片 | 一级毛片无毒不卡直接观看 | 亚州欧美 | 97精品久久久久中文字幕 | 欧美手机视频 |