2014-12-09 2 views
0

Grails 애플리케이션의 성능 문제가 있습니다. 서비스에서 트랜잭션을 제거하는 것이 좋습니다.Grails의 트랜잭션은 얼마나 비쌉니까?

서비스 변경을 측정 할 수있는 방법이 있습니까?

비싼 거래가 얼마나되는지에 대한 데이터가있는 곳이 있습니까? [시간과 자원으로]

+0

Visual VM과 같은 것을 사용하여 응용 프로그램을 프로파일하고 A/B를 수행하십시오. X 또는 Y가 더 많거나 적다는 말에는 너무 많은 요인이 관련되어 있습니다. 그것은 귀하의 응용 프로그램에 따라 다릅니다. 그것을 측정하십시오. –

+0

우리는 우리의 어플리케이션에서 놀라 울 정도로 비싼 거래를 발견했습니다. 이제 우리는 서비스를 '트랜잭션'및 '비 ​​트랜잭션'버전으로 분리합니다. 특히 루프 내에서 호출되는 서비스 메소드의 경우이를 수행하여 많은 성능 향상을 얻을 수있었습니다. @ JoshuaMoore가 암시 하듯이 프로파일 러를 사용하여 애플리케이션에서 트랜잭션의 영향을 확인하십시오. – rcgeorge23

답변

2

누군가 서비스에서 트랜잭션을 제거하는 것이 성과를 향상시키는 좋은 방법이라고 말하면 그 사람의 향후 조언을 듣지 않아야합니다. 트랜잭션에서 소비 된 시간을 살펴보고 실제 오버 헤드가 무엇인지 확인하고 트랜잭션에서 실행되는 메소드 및 전체 서비스를 찾고 트랜잭션이 아닌 것으로 수정하고 수정할 필요는 없습니다. 그러나 모든 거래를 제거하는 것은 무책임한 행동입니다.

메소드 반환 값에 의도적으로 산발적 인 오류를 추가하여 데이터가 일관성이 없게 만들고 트래픽이 많은 경우 악화됩니다. 다소 빠르지 만 버그가있는 앱이나 웹 사이트는 인기가 없을 것입니다. 그리고 이것이 성능에 도움이되지 않는다면 (또는 많지는 않지만) 여전히 병목 현상, 누락 된 색인 및 기타 문제를 찾는 실제 작업을 수행해야합니다. 진정으로 문제를 일으킨다.

모든 컨트롤러에서 주석 및 데이터베이스 쓰기를 모두 제거합니다. 성능상의 이유로가 아니라, 응용 프로그램 계층을 관련이없는 코드 및 논리로 감지 할 수 있도록 유지해야합니다.

트랜잭션이 필요없는 하나 이상의 서비스 메소드를 찾은 경우 필요에 따라 각 트랜잭션 메소드에 주석을 달고 클래스 스코프에서 주석을 생략하면 주석이 적용되지 않은 메소드는 아무 것도 상속받지 않으며 트랜잭션이 아닙니다. 또한 이러한 메소드를 비 트랜잭션 서비스로 이동할 수도 있습니다. 더 @Transactional 주석이없는 및 기능을 비활성화 transactional 속성이있는 경우 서비스는 비 트랜잭션이다

참고 :

static transactional = false 

그 속성이 더 주석을하지 않으면 것 ok 같아 보이지만 지정하지 않으면 transactional의 기본값은 true입니다.

많은 도움을 줄 수있는 뭔가가 이미 있습니다. dataSource 빈은 실제로 프록시의 프록시입니다. 하나의 프록시는 열려있는 Hibernate 세션 또는 트랜잭션에 의해 사용되는 풀에서 연결을 반환하므로 커밋되지 않은 데이터를 볼 수 있고 동일한 연결에서 쿼리와 업데이트를 수행 할 수 있습니다. 다른 하나는 귀하의 질문과 관련이 있습니다 : org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy 년 동안 봄에 있었지만 2.3 이후 Grails에서만 사용되었습니다. 트랜잭션을 시작하거나 트랜잭션에 참여하지만 데이터베이스 작업은 수행하지 않는 메소드에 도움이됩니다. 불필요하게 시작하여 '비어있는'트랜잭션을 커밋하는 단일 메서드 호출의 경우 오버 헤드는 풀링 된 연결을 가져온 다음 set autocommit false을 호출하고 트랜잭션 격리 수준을 설정하는 등의 작업을 포함합니다. 이러한 모든 작업은 비용이 적게 들지만 . 이 클래스는 이러한 메소드 호출을 캐시하는 프록시 연결을 제공하고 실제 연결 만 가져 와서 실제로 쿼리가 실행될 때이 메소드를 호출합니다. 쿼리가없고 유일한 호출이 트랜잭션 관련 설정 방법 인 경우에는 기본적으로 비용이 들지 않습니다. 당신은 이것에 의지해서는 안되고 @Transactional 어노테이션의 사용에 대해 의도적으로해야하지만, 당신이 이것을 놓치면이 풀 프록시는 불필요한 작업을 피할 수 있습니다.

관련 문제