2009-06-05 9 views

답변

0

어떤 매개 변수를 사용했는지, 어떤 요청인지 알 수 없습니다. 웹 앱을 작성하려고하십니까? 이것은 HttpRequest입니까? 요청에 따라 필요한 데이터 소스의 종류를 결정하고 있습니까?

그 질문에 대한 답변에 따라 데이터 소스에 동적 접근 할 필요가 있습니다. 여러 데이터 소스가있는 경우

는 요청의 다른 종류를 제공하는 각, 나는 데이터 소스가 특정 URL에 대한 선택의 웹 컨트롤러에 주입되는 서비스 객체에 주입해야한다고 건의 할 것입니다. 그렇게하면 데이터 소스를 다양하게 변경할 수 있으며 웹 계층의 URL 매핑보다 더 재미있는 일은 없습니다.

사용 사례에 대한 자세한 내용을 모른 채, 나는 당신이 봄에 새로운이고 제대로 아직 그것을 사용하는 방법을 모르기 때문에 당신이 일을 복잡하게 걸쳐있어 추측 것입니다. 모욕 의도는 없으며 단지 추측입니다.

UPDATE :

"나는 변경할 수 없습니다"- 당신은 적어도 가정하기 전에 클라이언트와상의해야합니다. 이것은 나쁜 생각입니다. 매개 변수를 암호화해도 사용자를 저장하지 않습니다.

당신은 컨트롤러는 당신이 필요로하는 모든 데이터 소스를 주입 것 공장을 인스턴스화하는 데 사용할 수있는 공장을 만드는 것이 더 낫다. 데이터 소스를지도에 저장하고 앞뒤로 키를주고 데이터 소스를 가져옵니다. 컨트롤러가 이미 요청에 액세스 할 수 있습니다. 사용자는 데이터베이스에 관한 모든 세부 사항을 알지 못하게합니다. 당신은 조회를 간단한 키로 만든다 (나는 아직도 그것을 좋아하지 않는다).

너무 어려워 보이는 경우에는하지 말아야합니다. 더 쉬운 방법이 있습니다. 다시 생각해.

+0

안녕하세요, 봄, 여러 개의 데이터 소스 콩을 만들고 싶지만 연결 매개 변수 (URL, 드라이버, 사용자, ...) 내 응용 프로그램에 다른 웹 응용 프로그램에 의해 전달됩니다, 나는 최대 절전 모드를 사용하고 난 몰라 어떻게 연결을 동적으로 생성하라는 요청의 매개 변수를 전달하려면 해결책이이 게시물의 마지막에 있다고 생각하십시오. http://stackoverflow.com/questions/517353/how-to-design-daos-when-the- # 958563 /958,563 데이터 소스 - 동적으로 다양하지만 미안 ThreadLocal을 또는 DataSourceLookup 또는 AbstractRoutingDataSource, 도움을 감사 ... –

+0

를 사용하여 요청에 액세스하는 방법을 이해 해달라고는 디자인처럼 소리 나는 않을 것 많이 좋아해. 연결 매개 변수를 전달하는 다른 웹 앱? 아니, 이것은 가장 가난한 종류의 캡슐화입니다. 필요한 데이터 소스에 대해 고객이 알아야합니다. 틀린, 틀린, 틀린. 다시 생각 해봐. 그것은 당신의 첫 번째 아이디어 일지 모르지만 마지막으로 생각하지 마십시오. – duffymo

+1

이러한 매개 변수를 전달하면 연결 풀링을 활용하지 않는다는 의미입니다. 어떻게 확장 할 수 있습니까? – duffymo

1

나는 이것이 당신이에 링크 된 답변에서지고 있었는지 같은 생각 :

경고 :이의 없음을 컴파일 없습니다. 이 중 아무 것도 테스트되지 않았습니다.

CurrentRequestFilter

요청에 한 번 실행됩니다. 나중에 사용하게 될 ThreadLocal에 현재 요청을 저장합니다.

public class CurrentRequestFilter extends OncePerRequestFilter { 

    private ThreadLocal<HttpServletRequest> currentRequest; 

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { 
     currentRequest.set(request); 
     filterChain.doFilter(request, response); 
    } 

    public ThreadLocal<HttpServletRequest> getCurrentRequest() { 
     return currentRequest; 
    } 

    public void setCurrentRequest(ThreadLocal<HttpServletRequest> currentRequest) { 
     this.currentRequest = currentRequest; 
    } 

} 

CurrentRequestDataSourceCurrentRequestFilter 같은 ThreadLocal에 대한 액세스를 갖는다.

public class CurrentRequestDataSource extends AbstractRoutingDataSource { 

    private ThreadLocal<HttpServletRequest> currentRequest; 

    @Override 
    protected DataSource determineTargetDataSource() { 
     HttpServletRequest request = currentRequest.get(); 

     String url = ...; 
     String username = ...; 
     String password = ...; 
     DataSource dataSource = ...; 

     return dataSource; 
    } 

    @Override 
    protected Object determineCurrentLookupKey() { 
     return null; 
    } 

    public ThreadLocal<HttpServletRequest> getCurrentRequest() { 
     return currentRequest; 
    } 

    public void setCurrentRequest(ThreadLocal<HttpServletRequest> currentRequest) { 
     this.currentRequest = currentRequest; 
    } 
} 

당신은 다음과 같은 여러분의 빈 정의 뭔가를 구성합니다 : 다시

<filter> 
    <filter-name>Current Request Filter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <init-param> 
     <param-name>targetBeanName</param-name> 
     <param-value>currentRequestFilter</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>Current Request Filter</filter-name> 
    <servlet-name>Name_Of_Your_Servlet</servlet-name> 
</filter-mapping> 

, 없음 :

<bean id="currentRequest" class="java.lang.ThreadLocal"/> 

<bean id="currentRequestFilter" class="CurrentRequestFilter"> 
    <property name="currentRequest" ref="currentRequest"/> 
</bean> 

<bean id="dataSource" class="CurrentRequestDataSource"> 
    <property name="currentRequest" ref="currentRequest"/> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

것은 그런 다음 CurrentRequestFilterweb.xml 파일에 등록되어 있는지 확인해야합니다 이 테스트를 거쳤으나 잘하면 일부 지침을 제공 할 수 있습니다.

+0

모두가 나에게 약간 펑키 한 냄새가납니다. 요청 매개 변수 (사용자 상자에서 기억 한 것)에 따라 데이터 소스를 변경합니다. 그러나 이것은 트릭을 수행해야하는 것처럼 보입니다. –

+0

기록을 위해, 나는 약간 펑키 한 것 같다. 나는 결코 그것을 스스로하지 않을 것이다. 나는 단지 다른 동료가 추천하고있는 것이 있는지 궁금해. 사실, 다른 동료의 대답은 처음부터 새로운 데이터 소스를 만드는 것을 다루지 않았습니다. 오히려, 그는 몇 가지 사전 구성된 데이터 소스 중에서 선택하고있었습니다. –

관련 문제