2009-05-31 2 views
0

서로 다른 "비즈니스"에 해당하는 여러 데이터베이스 (모두 구조적으로 동일한)의 정보를 관리하는 Java 서블릿 웹 응용 프로그램을 개발 중입니다. 사용자는 세션에 저장된 "현재 비즈니스"를 선택하고 응용 프로그램은 "현재 비즈니스"를 표시하거나 수정할 수 있습니다.서블릿 컨텍스트의 여러 동적 데이터 소스

동적 인 방법으로 jQuery를 사용하여 이러한 비즈니스에 액세스 할 수 있도록 tomcat Resources를 사용하고 싶습니다. 이 방법으로 서블릿에서 jstl sql 태그 또는 컨텍스트 조회를 사용할 수 있습니다. web.xml 파일의 각 리소스는 SQL 테이블에 저장되므로 정의 할 수 없습니다.

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %> 

<sql:query var = "users" dataSource="sources/${sessionScope.currentBusiness}"> 
    select id, firstName, lastName FROM user 
</sql:query> 

또는 서블릿 내가 "현재에 대한 올바른 데이터 소스를 얻을 수있는이

String request.getSession().getAttribute("currentBusiness"); 

Context initial = new InitialContext(); 
Context context = (Context) initial.lookup("java:comp/env"); 
DataSource source = (DataSource) context.lookup("sources/" + currentBusiness); 

같은 라인을 가질 수 있습니다 최종 결과는 이와 같은 선이 간단한 JSP를 쓸 수있다 사업".

나는 성공없이 javax.naming.spi.ObjectFactory에서 파생 된 내 자신의 ObjectFactories를 작성하여 실험했습니다. 이 작업을 쉽게 수행하는 방법에 대한 지침이 있습니까?

답변

2

다음과 같이 작동하는 SessionListener 및 Servlet으로 구성된 다음 솔루션에 대해 최종적으로 해결했습니다. 사용자가 로그인 및 세션이 생성 될 때마다

public class SessionListener implements HttpSessionListener { 

    public void sessionCreated(HttpSessionEvent event) { 

    HttpSession session = event.getSession(); 

    // get list of possible data sources available to this session 
    List<DataSource> sources = new ArrayList<DataSource>(); 
    ... code to get the available sources 

    // get the current data source 
    DataSource source = null; 
    ... code to get the current source        
    source = sources.get(0); // for example 

    // setup the session attributes 
    session.setAttribute("availableSources", sources); 
    session.setAttribute("currentSource", source); 

    } 

} 

가능한 데이터 소스 목록, 현재 하나, 세션에 배치 같습니다 SessionListener는 다음과 같은 형태를 갖는다. 데이터 소스는 사용자 로그인에 의존하기 때문에 세션 레벨에서 수행됩니다. 이제 응용 프로그램 내에서 데이터 소스에 액세스 할 수 있습니다.

public abstract class BoxletServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 

    HttpSession session = request.getSession(true); 
    String s = request.getParameter("source"); 

    // based on 's' choose from the available DataSource 
    List<DataSource> sources = (List<DataSource>) session.getParameter("availableSources"); 
    Source source = chooseFrom(sources, s);              
    session.setParameter("currentSource", source);   

    // forward to a page saying that the DataSource changed 

    } 

}

는 다음과 JSP를 생성 할 수있게되었습니다이 구현 :

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %> 

<sql:query var = "users" dataSource="${sessionScope.currentSource}"> 
    select id, firstName, lastName FROM user 
</sql:query> 

이 누군가 희망이 도움을 현재 데이터 소스를 변경하려면 나는이 단순화 된 버전과 서블릿을 생성 그밖에.

1

ServletContextListener에 데이터 소스를 만들고 ServletContext에 넣으십시오.

+0

그러면 JNDI 인터페이스를 통해 어떻게 액세스합니까? – rmarimon

+0

그렇게 할 수 없습니다. 아마도 동일한 청취자에서 context.bind (name, object)를 사용할 수 있을까요? –

+0

바람둥이가 만드는 컨텍스트는 읽기 전용입니다. – rmarimon

0

이 방법은 분명히 "효과가 있지만"각 비즈니스에 대해 별도의 동일한 데이터베이스 개념은 나에게 잘못되었습니다. 분명히 스키마 어딘가에서 비즈니스를 묘사 할 수있는 것은 가능합니다. 이러한 방식으로 구분하면 비즈니스마다 새 데이터베이스가 필요하며 스키마에는 새 비즈니스 식별자 만 필요합니다.

별도의 데이터베이스에있는 ETL 데이터를 특별보고 및 쿼리를위한 차원 큐브로 변환하지 않으면 비즈니스 간 데이터 마이닝의 가능성을 잃을 수도 있습니다.

그리고 JSTL <sql> 태그는 가장 간단한 웹 앱에서만 사용해야합니다. 중간 계층에서 유효성 검사를하지 않으면 SQL 주입 공격 가능성에 대해 스스로 열어 둡니다.

UPDATE :

당신은 AFAIK 당신의 web.xml에 자원을 선언, 그래서 새 데이터베이스있을 때마다 Tomcat을, 응용 프로그램을 중지 새로운 JNDI 소스를 구성하고 다시 시작해야합니다. 이전의 모든 클라이언트는 새로운 비즈니스/데이터베이스를 추가 할 때마다 응용 프로그램이 다운되면서 영향을 받으므로 클러스터 된 상태 여야합니다.

+0

여러 데이터베이스의 제한은 여러 회사를 대표하는 다른 관리 시스템 (내 통제하에 있지 않음)입니다. 저는 모든 회사 (매우 화려하지는 않음)를위한 미수금 추적 모듈을 작성 중이며 각 회사에 개별적으로 액세스해야합니다. jstl sql 태그에 대해서는 각 회사에 대한 정보를 표시하는 데만 사용하고 있습니다. – rmarimon

관련 문제