2012-02-22 4 views
20

레일에서 클래스 변수 @@를 사용하지 않는 이유는 무엇입니까? 거기에 보안 허점이 있습니까? 제가 레일스에서 ​​새 것처럼 대답하십시오. 인스턴스 변수 @variable_name을 많이 사용하고 있습니다. 한번 시도한 @@variable_name. 내가 아는레일에서 클래스 변수 @@를 사용하지 않는 이유는 무엇입니까?

는 클래스 변수는 대한 클래스 변수는 객체

하지만 정말 우리가 레일에 @@ 클래스 변수를 사용하지 말아야하는 이유 을 알고 싶습니다 사이에 공유 할입니까?

+0

자바에서'static' 변수처럼 들립니다. 사용하지 않을 이유가 없습니다. 인스턴스에 속하지 않으며 비동기 적으로 변경 될 수 있다는 점에 유의하십시오. – Chloe

답변

41

단순히 스레드로부터 안전하지 않기 때문입니다. 많은 레일 = 가능한 서버는 멀티 스레드입니다. 즉, 한 번에 여러 개의 실행중인 응용 프로그램 인스턴스가있을 수 있으며 사용자 중 한 명의 요청이 임의로 요청 될 것입니다. 클래스 변수는 프로세스간에 공유되지 않으므로 클래스 변수가 다음 요청에서 달라질 가능성이 있습니다.

의도적으로 단일 스레드 서버에서 앱을 실행해도 패키지가 요청간에 다시 시작되지 않고 클래스 변수가 손실되지 않는다고 보장 할 수 없습니다.

클래스 변수와 비슷한 기능을 원한다면 Memcached 또는 Redis와 같은 키 - 값 저장소를 살펴 보는 것이 좋습니다.

+0

@@ vars뿐만 아니라 프로세스 간에는 아무 것도 공유되지 않습니다. 같은 이유로 우리는 @vars를 사용하면 안된다고 생각합니까? –

+7

@Victor 글쎄,'@ variables'는 인스턴스 변수이고 ** 요청 내에서 ** 요청 내에서 일관성이 있습니다 ** 요청이 컨트롤러의 새로운 인스턴스를 생성하기 때문입니다. 그냥 다음 요청에서 그들을 찾을 것으로 기대하지 마십시오. – edgerunner

+0

downvoter는 이유를 설명해 줄 것입니까? – edgerunner

관련 문제