복붙노트

[SPRING] 스프링 / 하이버 네이트 읽기 전용 데이터베이스 트랜잭션이 읽기 - 쓰기보다 느리게 실행되는 이유는 무엇입니까?

SPRING

스프링 / 하이버 네이트 읽기 전용 데이터베이스 트랜잭션이 읽기 - 쓰기보다 느리게 실행되는 이유는 무엇입니까?

필자는 읽기 전용 데이터베이스 트랜잭션과 읽기 / 쓰기 데이터베이스 트랜잭션의 성능에 대한 연구를 해왔습니다. MySQL 서버는 원격이므로 다른 트랜잭션 유형 간의 차이점을 쉽게 볼 수 있습니다. 이것은 내가 알고있는 연결 풀링과 비교하여 1 차 JDBC 호출과 2 차 JDBC 호출 비교를 기반으로합니다.

DAO 호출에서 읽기 전용 트랜잭션을 사용하도록 Spring AOP를 구성하면 호출은 읽기 - 쓰기와 비교하여 30-40 % 느려집니다.

<!-- slower -->
<tx:method name="find*" read-only="true" propagation="REQUIRED" />

또는

// slower
@Transaction(readOnly = true)

대:

<!-- faster -->
<tx:method name="find*" read-only="false" propagation="REQUIRED" />

또는

// faster
@Transaction

tcpdump를 보면, 읽기 전용 트랜잭션이 MySQL과 더 많은 대화를하고있는 것처럼 보입니다. 다음은 읽기 전용 덤프와 읽기 전용 덤프의 차이점입니다.

감사합니다.

해결법

  1. ==============================

    1.좋아,이 재미있는 타고있다. 나를 배우고 나누기위한 제비 뽑기. 아래에 나와있는 것 중 일부는 분명해야하지만 잘하면 내 무지와 내가 배운 것은 다른 사람들에게 도움이 될 것입니다.

    좋아,이 재미있는 타고있다. 나를 배우고 나누기위한 제비 뽑기. 아래에 나와있는 것 중 일부는 분명해야하지만 잘하면 내 무지와 내가 배운 것은 다른 사람들에게 도움이 될 것입니다.

    질문 # 1에 대한 간단한 대답은 최대 세션 대기 상태가 set session.transaction.read.only 동기 JDBC 호출로 @Transaction (readOnly = true) 세션을 시작하고 set session.transaction.read.write 호출로 종료된다는 것입니다 . 이 호출은 읽기 - 쓰기 호출을 할 때 전송되지 않으므로 읽기 전용 호출이 느려집니다.

    질문 # 2에 대한 답변이 길수록 원격 데이터베이스 성능을 줄이기 위해 수행 한 다음과 같은 세부 작업이 필요합니다.

    그래서 기본적인 @ 트랜잭션 오버 헤드는 며칠 동안 480ms에서 20ms로 늘어났습니다. 100 "실생활"은 dao.find (...) 메소드에 대한 호출을 55 초에서 시작하여 4.5 초에 종료합니다. 예쁜 킥. 10x 속도 향상을 얻는 것이 항상 쉽기를 바랍니다.

    내 경험이 다른 사람들을 돕기를 바랍니다.

  2. from https://stackoverflow.com/questions/34797480/why-do-spring-hibernate-read-only-database-transactions-run-slower-than-read-wri by cc-by-sa and MIT license