日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Mybatis與Jpa的區(qū)別和性能對(duì)比總結(jié)

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

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

安裝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>

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

創(chuàng)建一個(gè)類

@Datapublic class TestMybatis { private Long id; /** * 域賬號(hào) */ private String userId; /** * 主度量 */ private String mainMetric; /** * 子度量 */ private String subMetric; /** * 度量條目 */ private String metricItem;}@SuppressWarnings('serial')@javax.persistence.Entity@javax.persistence.Table(name = 'test')@lombok.Datapublic class TestJpa { @javax.persistence.Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 域賬號(hào) */ private String userId; /** * 主度量 */ private String mainMetric; /** * 子度量 */ private String subMetric; /** * 度量條目 */ private String metricItem;}/** * @author Kakki * @version 1.0 * @create 2021-06-17 17:39 * 這個(gè)是用來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條數(shù)據(jù)。讓我們?cè)囋?0000條

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

那么這樣能看出來很大的差距了吧?為什么會(huì)差距這么大呢?我們看看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進(jìn)去的并且save里面還會(huì)去判斷這個(gè)主鍵是否為空也就是說n條循環(huán)n條if判斷,那樣性能肯定是衰減得非常多的拉

結(jié)論

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

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

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

小結(jié)

開發(fā)一個(gè)小型項(xiàng)目,Jpa效率肯定是比Mybatis高的,但是因?yàn)闃I(yè)務(wù)需求迭代更新越來越快,Jpa明顯是滿足不了很多東西,而且維護(hù)起來看Sql也是比MyBatis難。所以我更偏向于Mybatis,寫的Sql也更加簡(jiǎn)潔更容易維護(hù)。

到此這篇關(guān)于Mybatis與Jpa的區(qū)別和性能對(duì)比的文章就介紹到這了,更多相關(guān)Mybatis與Jpa區(qū)別和性能內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频欧美| 日韩精品1区2区3区| 久久天堂影院| 精品国产亚洲日本| 国产精品成久久久久| 婷婷综合六月| 亚洲一区观看| 国产亚洲精品美女久久久久久久久久| 欧美天堂一区| 高清精品久久| 久久婷婷丁香| 国产亚洲一级| 国产色99精品9i| 国产日韩欧美中文在线| 成人一区而且| 激情欧美一区二区三区| 日韩亚洲在线| 清纯唯美亚洲综合一区| 精品国产91| 婷婷综合激情| 国产日韩精品视频一区二区三区| 成人在线免费观看91| 免费久久久久久久久| 日韩中文字幕视频网| 久久99高清| 午夜久久99| 国产精品一区二区免费福利视频| 欧美freesex黑人又粗又大| 最新亚洲激情| 欧美国产日本| 蜜桃成人av| 欧美日韩网址| 99国产精品一区二区| 日本中文字幕一区二区视频| 97精品国产一区二区三区| 亚洲中字黄色| 福利一区在线| 视频精品一区| 亚洲成人精品| 国产日韩中文在线中文字幕| 激情久久婷婷| 麻豆成人综合网| 三级欧美在线一区| 国产精品第一国产精品| 欧美女激情福利| 精品三级在线| 亚洲视频电影在线| 不卡一二三区| 亚洲精品女人| 悠悠资源网久久精品| 久久精品系列| 亚洲综合婷婷| 日韩高清中文字幕一区二区| 日韩和欧美一区二区三区| 欧美日韩高清| 成午夜精品一区二区三区软件| 日韩久久99| 最新亚洲一区| 精品国产美女a久久9999| 天海翼亚洲一区二区三区| 伊人久久视频| 精品免费在线| 亚洲不卡视频| 午夜日本精品| www.九色在线| 国产欧美日韩精品高清二区综合区 | 日韩精品久久久久久久电影99爱 | 亚洲欧美视频一区二区三区| 国产中文欧美日韩在线| 亚洲bt欧美bt精品777| 亚洲一级特黄| 亚洲一区资源| 久久精品av麻豆的观看方式| 午夜精品亚洲| 99精品网站| 久久青青视频| 激情综合婷婷| 国产精品成人一区二区网站软件| 99国产精品久久久久久久| 成人日韩av| 国产精品嫩模av在线| 一区免费在线| 成人精品亚洲| 97精品国产福利一区二区三区| 国产欧美精品| 91亚洲精品在看在线观看高清| 天堂va蜜桃一区二区三区| 国产精品99免费看| 久久久精品久久久久久96 | 性色一区二区| re久久精品视频| 成人精品高清在线视频| 欧美精品aa| 久久99国产精品视频| 里番精品3d一二三区| 国产精品久久久网站| 国产精品麻豆成人av电影艾秋 | 欧美在线91| 午夜久久av| 亚洲网址在线观看| 免费成人av在线播放| 日韩在线一区二区| 蜜桃视频一区二区三区| 亚洲一区欧美| 热久久久久久| 欧美日本一区| 美女久久久久久| 国产一区二区三区日韩精品| 国产一区国产二区国产三区| 97精品在线| 日韩高清中文字幕一区二区| 丝袜av一区| 亚洲婷婷在线| 久久国产精品99国产| 综合亚洲自拍| 国产精品高潮呻吟久久久久| 久久久久伊人| 欧美天堂视频| 在线国产一区二区| 噜噜噜躁狠狠躁狠狠精品视频 | 99久久精品网| 久久国产福利| 欧美日韩中出| 黄色网一区二区| 九一成人免费视频| 中文字幕日韩亚洲| 国产精品对白| 日韩在线视频精品| 午夜日韩av| 亚洲精品欧美| 欧美极品一区二区三区| 日韩国产欧美| 午夜在线视频观看日韩17c| 日韩激情综合| 国产激情在线播放| 国产国产精品| 久久国产婷婷国产香蕉| www在线观看黄色| 欧美日韩视频一区二区三区| 亚洲精品自拍| av中文字幕在线观看第一页| 午夜欧美在线| 热久久久久久| 日韩精品一区二区三区免费观影 | 国产精品99久久久久久董美香| 高清日韩中文字幕| 噜噜噜躁狠狠躁狠狠精品视频| 国产无遮挡裸体免费久久| 欧美日韩视频免费观看| 亚洲精品系列| 青青久久av| 欧美精品观看| 久久国产精品成人免费观看的软件| 日韩中文字幕亚洲一区二区va在线 | 麻豆精品在线| 黄页网站一区| 天堂资源在线亚洲| 亚欧成人精品| 日韩欧美少妇| 日本亚洲欧美天堂免费| 日韩在线欧美| 国产私拍福利精品视频二区| 国产精品av久久久久久麻豆网| 国产伦精品一区二区三区视频| 日韩深夜视频| 日韩精品久久理论片| 久久久一二三| 麻豆国产精品777777在线| 美女尤物久久精品| 国产精品久久观看| 日韩av中文字幕一区| 欧美日韩少妇| 日韩久久精品网| 国产精品亚洲欧美一级在线| 激情综合网址| 毛片在线网站| 麻豆国产精品| 日韩av影院| 久久av一区| 波多野结衣久久精品| 国产日韩欧美三级| 综合色一区二区| 国产视频亚洲| 成人免费电影网址| 国产精品片aa在线观看| 亚洲精品乱码| 久久亚洲不卡| 亚洲一级网站| 久久精品青草| 美女av在线免费看| 精品国内亚洲2022精品成人| 最新亚洲国产| 久热精品在线| 亚洲综合不卡| 国产精品女主播一区二区三区| 成人三级高清视频在线看| 麻豆精品视频在线观看视频| 青青青国产精品| 亚洲毛片一区| 中文字幕日本一区二区|