문제

나는 javax.sql.DataSource 여러 서블릿에서 사용하고 싶습니다.나는 다음을 지정하는 아이디어를 좋아하지 않습니다.

@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;

내가 보기에 프레임워크는 모든 서블릿에 대해 DataSource를 찾아야 하며 DataSource의 이름이 변경되면 모든 서블릿도 변경되어야 할 것 같습니다.

내 생각은 각 서블릿에서 선언할 수 있는 싱글톤 EJB를 선언하는 것입니다.

@Startup
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DataSources {  
    @Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
    private DataSource liveDataSource_;

    public synchronized Connection getLiveConnection() throws SQLException {
        return liveDataSource_.getConnection();
    }
}

이것이 문제를 해결하는 합리적인 방법입니까?일반적인 문제라고 생각했던 것에 대해 약간 무거운 느낌이 듭니다.

도움이 되었습니까?

해결책

일반적으로 IMO는 괜찮습니다.그러나 Bean이 연결을 반환하지 않고 직접 DataSource를 반환하도록 하십시오.WebSphere와 같은 일부 AppServer는 Bean 컨텍스트가 다시 떠날 때 자동으로 연결을 닫습니다.

또 다른 해결책은 조회 대신 @Resource(name="myds")를 사용하는 것입니다.모든 서블릿이 하나의 웹 애플리케이션에 있는 경우 web.xml에서 res-ref-name myds를 사용하여 하나의 리소스 참조를 정의하고 해당 위치에서만 실제 조회 이름으로 확인할 수 있습니다.

다른 팁

그런 이유로만 EJB를 사용하는 것은 당신이 쓴 것처럼 너무 무거울 수 있다고 말하고 싶습니다.

첫째, 대부분의 최신 애플리케이션 서버는 해당 조회를 캐시하므로 비용이 많이 들지 않습니다.

두 번째 - Robert가 말했듯이 @Resource(name="myds")를 사용할 수 있습니다. 이는 동일한 리소스 참조를 사용하며 애플리케이션 서버의 매핑 기능을 사용하여 JNDI 이름에 매핑될 수 있습니다.

셋째 - CDI를 사용하여 다음과 같은 웹 모듈 전용 솔루션을 가질 수 있습니다.

다음과 같이 DataSource 정의를 보유하는 클래스를 작성하십시오.

public class Datasources {

    @Produces @Resource(name="jdbc/yourRef", lookup="yourJNDI")
    DataSource myDataSource;
}

그런 다음 Inject를 사용하여 서블릿을 사용하십시오.

public class MyServlet extends HttpServlet {
    @Inject 
    private DataSource myDs;   
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top