出于合规性原因,我的组织希望将我们的数据库连接设置从属性/XML 配置文件中取出并放入中央注册表中 - 理想情况下联合多个物理计算机,以避免单点故障。
我一直在研究使用 JNDI 来实现这一目标的可能性,但我自己并没有太多使用它的经验。有没有人有尝试做类似事情的经验?或者有什么更好的想法可以实现这一点?
我应该补充一点,我们的应用程序是独立的,不在任何 J2EE 容器中运行,因此任何容器特定的连接管理技术可能不是特别有用。
最佳答案
这可能是一个好的开始:
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 包中。
希望这有帮助。
关于java - Java 中的集中式数据库连接管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888046/