出于合规性原因,我的组织希望将我们的数据库连接设置从属性/XML 配置文件中取出并放入中央注册表 - 理想情况下联合多台物理机器,以避免单点故障。
我一直在研究使用 JNDI 来实现这一点的可能性,但我自己并没有太多使用它的经验。有没有人有尝试做类似事情的经验?或者关于如何实现这一点的任何更好的想法?
我应该补充一点,我们的应用程序是独立的,不在任何 J2EE 容器中运行,因此任何容器特定的连接管理技术可能不是特别有用。
出于合规性原因,我的组织希望将我们的数据库连接设置从属性/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 包中。
希望这可以帮助。
您试图遵守哪些法规?
您可以做的一件事是依赖通过 JNDI 公开的数据源。但是,这意味着您的连接设置位于您配置数据源的位置。
我怀疑您是否需要对数据库连接设置进行“水平调整”。您是否有特定的理由认为将设置放在一个地方可能会给您的应用程序带来风险?
坚持使用 XML/属性文件方法可能更简单,但使用某种集中配置管理系统来控制这些文件的内容。
据推测,如果您必须考虑集中数据源配置之类的东西,那么您已经有了一些东西(CFEngine、puppet、chef、rdist...)来管理操作系统配置文件——那么为什么不直接使用它呢?