1

this과 같은 높은 평판 사용자의 답변을 보면 모든 단일 연결 요청에서 JNDI 이름 지정 서비스를 쿼리하여 새로운 DataSource 개체를 얻는 것이 적합하다고 보입니다. 예 : (더 간결 링크 대답에서 적응) 다음과 같은 코드 :모든 연결에 대해 JNDI에서 새로운 데이터 소스를 가져와야합니까?

public class ConnectionManager{ 
     public static Connection getConnection() throws NamingException { 
      Context initContext = new InitialContext(); 
      Context envContext = (Context)initContext.lookup("java:/comp/env"); 
      DataSource dataSource = (DataSource)envContext.lookup("jdbc/test"); 
      return dataSource.getConnection(); 
     } 
} 

이 제안/숙어 방법, 정말? 내 자신의 "ConnectionManager"유틸리티 클래스 중 일부에서는 DataSource 객체에 대한 참조를 인스턴스 변수로 사용했습니다. 이 주위에 유지하는 안티 패턴, 그래서

java.sql.SQLException: javax.resource.ResourceException: IJ000451: The connection manager is shutdown 

: 아무 문제는 JBoss 관리자가 사용할 경우를 제외하고 그것을 배출되지 않습니다 및 다음과 같은 연결 관리 콘솔에서 풀하고 내 코드가지고 있다고 오류가 활성화 JDBC에서 DataSource 객체의 인스턴스?

답변

1

DataSource 객체는 캐시 될 수 있으며 스레드 안전성을 제공합니다. JNDI는 JNDI에서 JNDI를 가져올 때마다 요청을 무시할 수있을 정도로 충분히 최적화되어야합니다. 동일한 인스턴스가 JNDI에서 다시 전달됩니다.

당신은 예를 들어, 자바 EE 환경에서 작업하는 경우, 같은 클래스 레벨에서 데이터 소스를 삽입 할 수있는 사양 표준입니다 : 또한

public class MyServlet extends HttpServlet { 

    @Resource 
    DataSource ds; 

    public void processRequest() { 
    try(Connection con = ds.getConnection()) { 
     // ... 
    } 
    } 

} 

,이 데이터 소스를 공유 할 수 완전히 안전 여러 스레드에 걸쳐있는 객체. 반면에, Connection 객체를 여러 스레드에 공유하는 것은 큰 실수입니다. 그 이유는 스펙 당 스레드가 안전하지 않기 때문입니다.