2012-02-15 2 views
0

싱글 톤 클래스 오브젝트의 예를 보았습니다. 여기에는 데이터베이스에서 검색 한 사용자 ID와 비밀번호가 들어있는 맵이 있습니다. 이렇게하면 사용자가 로그인 할 때마다 DB를 누르지 않아도됩니다.서블릿 컨텍스트와 싱글 톤 오브젝트

이제 ServletContext 특성을 통해이 작업을 수행 할 수 없다고 생각합니다.

기본적으로 두 경우 모두 우리는 응용 프로그램의 넓은 객체를 갖습니다.

그래서이 경우 ServletContext 특성을 사용할 수 있습니까?

+0

은 예,의 ServletContext 속성이 사용될 수있다 : 당신은뿐만 아니라 사용자 이름 컬럼 인덱스 암호 컬럼에 UNIQUE 인덱스를 설정하면, 다음과 같은 상황이 훨씬 더 효율적 방법입니다. –

+0

싱글 톤은 너무 과대 평가되어 오해되고 학대 당한다. 왜 당신이 정말로 필요한지 이해할 때까지 그것에 대해 생각하지 마십시오. – BalusC

답변

3

응용 프로그램의 어느 곳에서든지 Map에 액세스해야한다면 실제로 배치하는 것이 가장 좋습니다.

당신은 등록 할 수있는 Servlet Context Listener 다음 해당 속성

getServletContext().getAttribute("UsersMap");

를 얻어서 어디서든 웹 응용 프로그램에 의해 사용 액세스 contextInitialized에 당신은 싱글 톤을 얻을 수 ServletContext

의 속성으로 저장

1

DB의 데이터가 기본적으로 정적 인 경우 그렇습니다. 그렇게 할 수 있습니다. DB의 데이터가 동적 인 경우, 아니요, 권장하지 않습니다. 그렇지 않으면 DB와 servletcontext 변수를 동기화 상태로 유지하기 위해 꽤 많은 코드를 작성해야합니다. 새 사용자가 webapp에 등록하면 당연히이 사용자가 로그인 할 수있게됩니다.

DB에 1 백만 명의 사용자가 있다면 어떻게해야합니까? 이 모든 것을 서버의 메모리에 실제로 복사 하시겠습니까? 무슨 목적으로? 이것은 DB의 목적을 완전히 무효로 만듭니다. 로그인을 확인 하시겠습니까? 로그인을 확인하는 것이 서버의 메모리에 전체 DB의 복사본이 필요하다는 비싼 이유가 무엇인지 상상할 수 없습니다. 이것은 약간 괜찮은 DB가 1 밀리 초 이내에 할 수있는 직업입니다. 문제의 원인은 분명히 다른 곳에서 해결되어야합니다.

아마도 SQL WHERE 절을 사용하는 대신 전체 DB를 Java 메모리로 불필요하게 복사하고 행 단위로 Java에서 유효성 검사를 완전히 수행하고 있습니까? 이 같은?

resultSet = statement.executeQuery("SELECT * FROM users"); 

while (resultSet.next()) { 
    if (username.equals(resultSet.getString("username")) && password.equals(resultSet.getString("password"))) { 
     valid = true; 
     break; 
    } 
} 

이것은 데이터베이스를 처음 사용하고 SQL의 능력을 이해하지 못하는 초보자에게 자주 발생하는 실수입니다.

statement = connection.prepareStatement("SELECT id FROM users WHERE username=? AND password=md5(?)"); 
statement.setString(1, username); 
statement.setString(2, password); 
resultSet = statement.executeQuery(); 
valid = resultSet.next(); 
+0

나는 완전히 당신의 요점을 잘 모르겠다. 나는 메모리가 많은 1M 사용자 이름을 의미합니까? 예를 들어 캐싱 메커니즘을 사용한다면 어떨까요? 캐싱은 좋지 않다고 생각합니까? – Cratylus

+0

@ user384706 : 요점은, 잘 설계된 DB가 잠깐 후에 당신을 대신해서 당신을 골라 낼 수 있다면, 왜 당신은 메모리에 DB 사본을 가지고있을 것인가? 캐싱에 관해서는 JDBC 대신 JPA를 사용합니다. 2 차 레벨 캐시 구성이 가능합니다. – BalusC

+0

우선 DB 전체를 복사하는 것에 대해 언급하는 이유는 무엇입니까? OP는 사용자 이름이 캐시되기를 원합니다. 1M 사용자가 DB에 존재한다고 가정 해 봅시다. 'HashMap'에서? DB 전체에 대한 캐싱 메커니즘이 있습니다. 구아바 캐시는 그렇게하고 memcached와 다른 라이브러리가 있다고 생각합니다. db가 너무 빠르면 왜 존재합니까?제가 이것들을 요구하는 이유는 당신이 저보다 경험이 많아서 당신의 요지를 얻으려고하기 때문입니다. – Cratylus