2011-12-13 4 views
2

여러 데이터베이스에 연결되는 Java 응용 프로그램을 만들고 있습니다. 사용자는 드롭 다운 상자에서 연결할 데이터베이스를 선택할 수 있습니다.Java가 여러 데이터베이스에 연결 중

그러면 프로그램은 Oracle 웹 로직 데이터 소스와 대화 할 수 있도록 초기 컨텍스트를 만드는 메소드에 이름을 전달하여 데이터베이스에 연결합니다.

public class dbMainConnection { 

    private static dbMainConnection conn = null; 
    private static java.sql.Connection dbConn = null; 
    private static javax.sql.DataSource ds = null; 
    private static Logger log = LoggerUtil.getLogger(); 

    private dbMainConnection(String database) { 

     try { 

      Context ctx = new InitialContext(); 

      if (ctx == null) { 
       log.info("JDNI Problem, cannot get InitialContext"); 
      } 

       database = "jdbc/" + database; 
       log.info("This is the database string in DBMainConnection" + database); 
       ds = (javax.sql.DataSource) ctx.lookup (database); 


     } catch (Exception ex) { 
      log.error("eMTSLogin: Error in dbMainConnection while connecting to the database : " + database, ex); 
     } 

    } 

    public Connection getConnection() { 

     try { 

      return ds.getConnection(); 

     } catch (Exception ex) { 
      log.error("Error in main getConnection while connecting to the database : ", ex); 
      return null; 
     } 

    } 

    public static dbMainConnection getInstance(String database) { 

     if (dbConn == null) { 
      conn = new dbMainConnection(database); 
     } 

     return conn; 

    } 

    public void freeConnection(Connection c) { 
     try { 
      c.close(); 
      log.info(c + " is now closed"); 
     } catch (SQLException sqle) { 
      log.error("Error in main freeConnection : ", sqle); 
     } 
    } 

} 

내 문제는 누군가가 데이터베이스에 대한 데이터 소스를 만들 잊어 말을하지만 그들은 여전히 ​​드롭 다운 상자에 추가하면 어떻게 무엇인가? 지금은 데이터 소스가없는 데이터베이스에 연결하고 연결하려고하면 연결이 끊어 질 수 없다는 오류가 발생합니다. 어떤 것을 원하지만 데이터 소스가없는 데이터베이스에 먼저 연결 한 다음 데이터 소스가없는 데이터베이스에 연결하려고 시도하면 다시 오류가 발생합니다.

.naming.NameNotFoundException : 'jdbc.peterson'을 확인할 수 없습니다. 해결 된 'jdbc'; 나머지 이름은 '피터슨'.

내가 다시는 기대할 수 있지만 나에게 혼란 스럽다는 것은 다른 데이터베이스에 대한 마지막 연결을 잡아서 아무 일도 일어나지 않는 것처럼 모든 것을 처리한다는 것입니다.

누구나 알고 계십니까? weblogic이 연결이나 무언가를 fail safe로 캐싱하고 있습니까? 이런 식으로 연결을 만드는 것은 나쁜 생각입니까?

+0

dbMainConnection의 catch 범위에서 ds를 null로 만들려고 했습니까? –

답변

4

정적 변수 변수에 고유 한 데이터 소스 (및 연결 및 dbMainConnection)를 저장합니다. 다른 사용자가 데이터 소스를 요청할 때마다 이전 데이터 소스로 대체합니다. JNDI에서 데이터 소스를 가져 오는 동안 예외가 발생하면 정적 데이터 소스는 그대로 유지됩니다. 정적 변수에는 아무것도 저장하지 말아야합니다. dbMainConnection 클래스는 데이터베이스의 이름으로 생성되고 여러 개의 데이터베이스 이름이 있기 때문에이를 싱글 톤으로 만드는 것은 의미가 없습니다.

public final class DataSourceUtil { 
    /** 
    * Private constructor to prevent unnecessary instantiations 
    */ 
    private DataSourceUtil() { 
    } 

    public static DataSource getDataSource(String name) { 
     try { 
      Context ctx = new InitialContext(); 
      String database = "jdbc/" + name; 
      return (javax.sql.DataSource) ctx.lookup (database); 
     } 
     catch (NamingException e) { 
      throw new IllegalStateException("Error accessing JNDI and getting the database named " + name); 
     } 
    } 
} 

그리고 발신자가 데이터 소스에서 연결을 얻을 그들은 그것을 사용이 끝나면 닫을 수 있도록 :

그냥 데이터 소스에 액세스하려면 다음 코드를 사용합니다.

+0

굉장합니다. 도와 주셔서 감사합니다. 분명히 나는 ​​자바 newb이므로 명확한 설명과 코드를 주셔서 감사합니다. 내가 이해하는지 확인하기 위해서. dbconnect 클래스를 없애고 대신 dataSourceUtil 클래스를 사용하여 데이터 소스를 가져옵니다. 그런 다음 그것을 사용하여 다른 데이터베이스에 대한 연결을 만듭니다. 이후에 데이터베이스 연결과 초기 컨텍스트를 닫습니다. 그게 맞습니까? – enderjs

+0

오른쪽 (닫을 수는없는 InitialContext 닫기를 제외하고는 열어 두는 것이 중요하지 않다고 생각합니다). –

0

존재하지 않는 데이터 소스를 조회 할 때 JNDI 예외가 발생하지만 사용자가 이전에 조회 한 데이터 소스에 대한 참조를 유지합니다. A.B. Cade가 말하길, 예외가 발생하면 ds에 대한 참조가 null이거나 그 전에 참조됩니다.

더 일반적으로 싱글 톤을 사용하는 것이 가장 좋은 방법은 아닙니다.

관련 문제