Mybatis 와 Jpa 의 차이 점 과 성능 비교 총화
요 며칠 친구 에 게 JPA 가 아주 쓰기 좋다 는 말 을 들 었 는데,sql 을 쓸 필요 가 전혀 없다.나 는 프로그래머 가 sql 을 쓰 지 않 고 프로그래머 를 부 를 수 있 을 까 생각 하고 있다.그리고 고 급 스 러 운 도구 가 많이 포 장 될 수록 확장 성과 효율 이 매우 낮 습 니 다.게다가 저 는 너무 포 장 된 것 을 좋아 하지 않 습 니 다.평소에 손 으로 sql 을 쓰 는 것 을 좋아 하기 때문에 my batis 로 업 무 를 써 왔 습 니 다.그 다음 에 jpa 의 saveAll()대량 삽입 대량 업데이트 속도 가 너무 느 려 서 엑셀 로 가 져 온 일부 물건 들 이 매우 느 리 고 원래 동기 화 되 어 해결 할 수 있 는 일 을 가 져 올 때마다 비동기 화 를 켜 야 한 다 는 것 을 알 게 되 었 습 니 다.개인 적 으로 이런 방법 은 매우 좋 지 않다 고 생각 합 니 다.비동기 화 는 현재 의 업무 에 영향 을 주지 않 고 다른 시간 대 에 하 는 것 이기 때문이다.예 를 들 어 정시 작업,비동기 업데이트 증분 정보 등 이다.코드 에 비동기 패키지 가 매우 많 습 니 다.즉,엑셀 가 져 오 는 것 은 비동기 입 니 다.그 다음 에 jpa 는 느 리 고 비동기 안에 비동기 가 포함 되 어 있 습 니 다.전체 링크 가 매우 길 어서 문제 가 발생 할 수 있 습 니 다.반나절 동안 조사해 야 합 니 다.
jpa 와 my batis 설치
<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 를 부모 클래스 로 도입 하면 됩 니 다.클래스 만 들 기
@Data
public class TestMybatis {
private Long id;
/**
*
*/
private String userId;
/**
*
*/
private String mainMetric;
/**
*
*/
private String subMetric;
/**
*
*/
private String metricItem;
}
@SuppressWarnings("serial")
@javax.persistence.Entity
@javax.persistence.Table(name = "test")
@lombok.Data
public 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
*/
@Repository
public interface TestRee extends JpaRepository<TestRe, String> {
}
이것 은 my batis 의 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]8081ms
22:37:05.005 [main] INFO c.e.c.ColaDemoApplicationTests - [m]613ms
\#10w 더 해 봐
22:38:49.085 [main] INFO c.e.c.ColaDemoApplicationTests - [jpa]65710ms
22:39:09.844 [main] INFO c.e.c.ColaDemoApplicationTests - [m]9448ms
그러면 이렇게 하면 차이 가 엄 청 나 겠 죠?왜 이렇게 차이 가 나 지?saveAll()소스 좀 봅 시다.
@Transactional
@Override
public <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
@Override
public <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=10000
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
물론 오늘 저 는 jpa 의 성능 으로 my batis 와 비 교 했 을 뿐 입 니 다.그러나 코드 농 으로서 기술 은 업 무 를 위 한 것 이라는 것 을 잘 알 고 있 습 니 다.Jpa 는 물론 그의 장점 도 있 습 니 다.예 를 들 어 findAllByIdin(List ids)을 만 들 면 이 조건 으로 조회 하 는 목록 을 직접 얻 을 수 있 습 니 다.그리고 findAllByOrderId AndOrderType(String orderId,String orderType)도 있 습 니 다.아주 편리 하고 sql 을 쓸 필요 도 없습니다.그 는 자동 으로 조회 작업 을 완성 할 것 입 니 다.작은 매듭
작은 프로젝트 를 개발 하면 Jpa 의 효율 은 Mybatis 보다 높 을 것 입 니 다.그러나 업무 수요 의 교체 업데이트 가 점점 빨 라 지고 Jpa 는 많은 것 을 만족 시 키 지 못 할 것 이 분명 합 니 다.그리고 유지 하기 위해 Sql 도 MyBatis 보다 어렵 습 니 다.그래서 저 는 Mybatis 를 선 호 합 니 다.Sql 도 더욱 간결 하고 유지 하기 쉽 습 니 다.
마 이 바 티 스 와 Jpa 의 차이 점 과 성능 대비 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.마 이 바 티 스 와 Jpa 의 차이 점 과 성능 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.