2009-05-20 49 views
1

由於兼容性原因,我的組織希望將我們的數據庫連接設置從屬性/ XML配置文件中取出,並放入中央註冊表中 - 理想情況下通過多臺物理機聯合使用,以避免單點故障。Java中集中的數據庫連接管理

我一直在尋找使用JNDI來實現這一目標的可能性,但是我自己並沒有真正使用它的經驗。有沒有人有經驗試圖做類似的事情?或者有關如何實現這一點的更好的想法?

我應該補充一點,我們的應用程序是獨立的,不能在任何J2EE容器中運行,因此任何容器特定的連接管理技術可能都不是特別有用。

回答

0

堅持使用XML/properties文件方法可能會更簡單,但使用某種集中式配置管理系統來控制這些文件的內容。假設你不得不考慮集中數據源配置之類的東西,那麼你已經有了一些東西(CFEngine,puppet,chef,rdist,...)來管理操作系統配置文件 - 爲什麼不呢用那個?

0

您試圖遵守哪些法規?

您可以做的一件事就是依賴通過JNDI公開的數據源。但是,這意味着您的連接設置位於數據源配置的位置。

我懷疑你需要'水平'與你的數據庫連接設置。是否有一個特定的原因,您認爲在一個地方進行設置會給您的應用程序帶來風險?

1

這可能是一個良好的開端:

HashMap<String,String> dsNames = new HashMap<String,String>(); 
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); 
    System.setProperty(Context.PROVIDER_URL, "file:/home/user/tmp"); 
    InitialContext ic = new InitialContext(); 
    dsNames.put("yourDataSourceName", "jdbc/your_jndi_name"); 
    // Construct BasicDataSource reference 
    Reference ref = new Reference("javax.sql.DataSource", 
      "org.apache.commons.dbcp.BasicDataSourceFactory", null); 
    ref.add(new StringRefAddr("driverClassName", "theDriver")); 
    ref.add(new StringRefAddr("url","theDBURL")); 
    ref.add(new StringRefAddr("username", "obvious")); 
    ref.add(new StringRefAddr("password", "obvious")); 
    ref.add(new StringRefAddr("maxActive", "10")); 
    ref.add(new StringRefAddr("maxIdle", "3")); 
    ref.add(new StringRefAddr("initialSize", "3")); 
    ref.add(new StringRefAddr("maxWait", "5")); 
    ic.rebind("jdbc/your_jndi_name", ref); 

    //And to get a reference to your data source anywhere else in your program: 
    InitialContext ic2 = new InitialContext(); 
    DataSource myDS = (DataSource) ic2.lookup(dsNames.get(dsName)); 

現在你可以看到,我使用連接池工廠,但你可以替換,以滿足您的需求。此外,初始上下文工廠是FSContext,這意味着JNDI名稱將在常規文件系統中查找,URL上下文工廠必須可用,但我從未使用它。大多數使用的類都在javax.naming包中。

希望這會有所幫助。