2009-12-16 3 views
9

세션 빈으로 구현 된 Java 웹 서비스에서 데이터베이스 연결이 필요하며 올바르게 처리하는지 잘 모르겠습니다. 나는 연결이 필요 할 때마다JDBC 연결 풀 (글래스 피쉬)의 올바른 사용

은 내가

Connection cn = null; 
try 
{ 
    cn = SQLUtils.getSQLConnection(); 
    // use connection 
} 
finally 
{ 
    if (null != cn) 
    { 
     try 
     { 
      cn.close(); 
     } 
     catch (SQLException e) 
     { 

     } 
    } 
} 

그것은이 방법을 사용하거나 I 데이터 소스는 콩의 구성원이어야합니다 됐나요

을 클래스

public final class SQLUtils { 
    //..... 
    private static DataSource m_ds=null;  

    static 
    { 
     try 
     { 
      InitialContext ic = new InitialContext(); 
      m_ds = (DataSource) ic.lookup(dbName); //Connection pool and jdbc resource previously created in Glassfish , dbName contains the proper JNDI resource name 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      m_ds = null; 
     } 

    } 

    public static Connection getSQLConnection() throws SQLException 
    { 
     return m_ds.getConnection();    
    } 
} 

을 만들어?

@Stateless 
    @WebService 
    public class TestBean { 
    private @Resource(name=dbName) DataSource m_ds; 
    } 

유감스러운 질문이지만 유감스럽게 생각합니다. 미리 감사드립니다.

답변

14

C 스타일 서식 지정, 몇 줄의 불필요한 줄 및 약간의 예외 처리 외에도 그렇게 할 수 있습니다. 여기

내가 그것을 할 거라고 방법은 다음과 같습니다

public final class SQLUtil { 
    private static DataSource dataSource; 
    // .. 

    static { 
     try { 
      dataSource = (DataSource) new InitialContext().lookup(name); 
     } catch (NamingException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 

    public static Connection getConnection() throws SQLException { 
     return dataSource.getConnection();    
    } 
} 

여기 던져 ExceptionInInitializerError 응용 프로그램이 즉시 연결을 획득 할 때 NullPointerException "설명 할 수없는"에 직면 할 필요가 없습니다 너무 중지됩니다 있도록.

+1

+1 내가 알지 못하는 ExceptionInInitializerError. – ewernli

+2

그러나 나는 조롱하고 테스트하기가 더 쉽기 때문에 콩 자체에 주입하는 것을 선호합니다. – ewernli

+0

답장을 보내 주셔서 감사합니다. – a1ex07

10

고대 J2EE 세계에서 이것을 관리하는 전통적인 방법은 ServiceLocator을 사용하는 것이 었습니다.

public class ServiceLocator { 
    private Context initalContext; 

    private static ServiceLocator ourInstance = new ServiceLocator(); 

    public static ServiceLocator getInstance() { 
     return ourInstance; 
    } 

    private ServiceLocator() { 
     try { 
      this.initalContext = new InitialContext(); 
     } catch (NamingException ex) { 
      throw new ServiceLocatorException(...); 
     } 
    } 

    public DataSource getDataSource(String dataSourceName) { 
     DataSource datasource = null; 

     try { 
      Context ctx = (Context) initalContext.lookup("java:comp/env"); 
      datasource = (DataSource) ctx.lookup(dataSourceName); 
     } catch (NamingException ex) { 
      throw new ServiceLocatorException(...); 
     } 

     return datasource; 
    } 
} 

는 다음과 같이 호출 단순히 그것을 사용하려면 : 아래 샘플 구현 (비 최적화는 DataSource 캐시 할 수있다)

DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/mydatabase"); 

을하지만이 EJB3와 의존성 주입 이전했다 연대.

: EJB3를 사용하는 경우 이제, 당신이 당신의 EJB 컨테이너에 설치하여 DataSource이있는 경우, 은 당신이해야 할 모든 자동 무국적 콩의 DataSource을 주입하는 것은 (mydatabase는 데이터 소스의 이름입니다)를 작성하는 것입니다

@Resource(name="jdbc/mydatabase") 
private DataSource dataSource; 

EJB3 실제로 ServiceLocator 패턴이 쓸모하고 그들과 함께 작업 할 때 당신이 정말로 주입을 선호한다 : 당신이 명시 적으로, 음, 이름을 설정하려면

@Resource 
private DataSource mydatabase; 
이름 속성을 사용합니다.

+2

아, 나는 그것을 알고 있었다. 그게 실제로 ** 많은 헬퍼 클래스보다 ** 많은 **. +1. – BalusC

0

음, 이것은 에 대한 예가 아님 JDBC 데이터 원본 아니요 글래스 피시 연결 풀?