由於兼容性原因,我的組織希望將我們的數據庫連接設置從屬性/ XML配置文件中取出,並放入中央註冊表中 - 理想情況下通過多臺物理機聯合使用,以避免單點故障。Java中集中的數據庫連接管理
我一直在尋找使用JNDI來實現這一目標的可能性,但是我自己並沒有真正使用它的經驗。有沒有人有經驗試圖做類似的事情?或者有關如何實現這一點的更好的想法?
我應該補充一點,我們的應用程序是獨立的,不能在任何J2EE容器中運行,因此任何容器特定的連接管理技術可能都不是特別有用。
由於兼容性原因,我的組織希望將我們的數據庫連接設置從屬性/ XML配置文件中取出,並放入中央註冊表中 - 理想情況下通過多臺物理機聯合使用,以避免單點故障。Java中集中的數據庫連接管理
我一直在尋找使用JNDI來實現這一目標的可能性,但是我自己並沒有真正使用它的經驗。有沒有人有經驗試圖做類似的事情?或者有關如何實現這一點的更好的想法?
我應該補充一點,我們的應用程序是獨立的,不能在任何J2EE容器中運行,因此任何容器特定的連接管理技術可能都不是特別有用。
堅持使用XML/properties文件方法可能會更簡單,但使用某種集中式配置管理系統來控制這些文件的內容。假設你不得不考慮集中數據源配置之類的東西,那麼你已經有了一些東西(CFEngine,puppet,chef,rdist,...)來管理操作系統配置文件 - 爲什麼不呢用那個?
您試圖遵守哪些法規?
您可以做的一件事就是依賴通過JNDI公開的數據源。但是,這意味着您的連接設置位於數據源配置的位置。
我懷疑你需要'水平'與你的數據庫連接設置。是否有一個特定的原因,您認爲在一個地方進行設置會給您的應用程序帶來風險?
這可能是一個良好的開端:
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包中。
希望這會有所幫助。