2011-12-18 32 views
-2

我需要初始化一個給定url和驅動程序的DataSource。其需要足夠通用以支持Oracle和SQL Server。 應用程序是在JBoss 5.雙方提供樣品從url和驅動程序獲取DataSouce

運行:

<db-connection name="TEST-ORACLE"> 
<url>jdbc:oracle:thin:@test:1521:ins1</url> 
<driver>oracle.jdbc.xa.client.OracleXADataSource</driver> 
<user>user</user> 
<password>{ENCR}oRloKFKlqXs=</password> 
<min-size>5</min-size> 
<max-size>30</max-size> 
<idle-timeout-minutes>1</idle-timeout-minutes> 
</db-connection> 

<db-connections> 
    <db-connection name="TEST-MSSQLSERVER"> 
    <url>jdbc:jtds:sqlserver://server:1433/db;ProgramName=program;SelectMethod=cursor;useLOBs=false</url> 
    <driver>net.sourceforge.jtds.jdbc.Driver</driver> 
    <user>user</user> 
    <password>{ENCR}oRloKFKlqXs=</password> 
    <min-size>40</min-size> 
    <max-size>80</max-size> 
    <idle-timeout-minutes>1</idle-timeout-minutes> 
</db-connection> 

的OracleXADataSource正在實施inteface DataSource,這樣的跳槽容易...但林不知道該通用就夠了。

編輯

我不知道應該才達到,如果我有multipile DB連接和multipile情況下/在這些連接模式.....

我當前的代碼看起來像這樣:

private DataSource getDataSourceForTanent(TenantConfig i_Tenant) { 
     DataSource result = null; 
     ClassLoader loader = DBConnector.class.getClassLoader(); 
     try { 
      Class driverClass = loader.loadClass(i_Tenant.getDriver()); 
      Object driver = driverClass.newInstance(); 
      if(driver instanceof OracleDataSource){ 
       ((OracleDataSource)driver).setURL(i_Tenant.getUrl()); 
       ((OracleDataSource)driver).setUser(i_Tenant.getUser()); 
       ((OracleDataSource)driver).setPassword(i_Tenant.getPassword()); 
       result = (DataSource) driver; 
      } else if(driver instanceof Driver){ 
       Properties prop = new Properties(); 
       prop.put("user", i_Tenant.getUser()); 
       prop.put("password", i_Tenant.getPassword()); 
       prop.put("min-size", i_Tenant.getMinSize()); 
       prop.put("max-size", i_Tenant.getMaxSize()); 
       prop.put("idle-timeout-minutes", i_Tenant.getIdleTimeoutMinute()); 
       Connection con = ((Driver)driver).connect(i_Tenant.getUrl(), prop); 
       if(con != null){ 
        //TODO: SQLServer handling 
       } 
      } 

     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return result; 
    } 

TenantConfig是一個Java bean保持XML屬性。

+0

你到底在問什麼?如果您告訴它JDBC驅動程序類是什麼,JBoss負責給您一個DataSource。你不必關心任何事情。 – 2011-12-18 10:25:30

+0

我有multipile db連接,我需要得到一個數據源給定的數據庫連接名稱。使用該配置所有數據庫的xml文件。 – 2011-12-18 10:34:47

+0

@JBNizet我希望我mannage讓我的問題更清晰一點 – 2011-12-18 10:50:06

回答

1

這裏有一個通用的代碼片段通過JNDI名獲得一個DataSource:

Context initContext = new InitialContext(); 
Context envContext = (Context)initContext.lookup("java:/comp/env"); 
DataSource ds = (DataSource)envContext.lookup("jdbc/mydatasource"); 

但是從你的XML文件我不知道JNDI名稱是什麼。它的XML方言是什麼?

+1

@Noam:那又如何?這是在JEE應用程序中獲取DataSource的標準方式。 JEE服務器負責根據其配置返回一個DataSource。 – 2011-12-18 10:35:08

+1

@Noam:實際上是從JBoss'es網站複製粘貼的。驚喜:這是正確的做法,所有體面的網站都是這樣發佈的。 – 2011-12-18 10:42:12

+0

@KasperSørensen不要受到侮辱它只是不是我在問什麼,併發布的代碼不是我的問題的解決方案... – 2011-12-18 10:49:24

相關問題