Mybatis 와 Jpa 의 차이 점 과 성능 비교 총화

7650 단어 mybatisjpa구별
머리말
요 며칠 친구 에 게 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]10576ms
22: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 의 차이 점 과 성능 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기