Java中的集中式数据库连接管理

时间:2009-05-20 13:54:16

标签: java database-connection jndi

出于合规性原因,我的组织希望将我们的数据库连接设置从属性/ XML配置文件中提取到中央注册表中 - 理想情况是通过多台物理机联合,以避免单点故障。

我一直在研究使用JNDI实现这一目标的可能性,但我自己并没有太多使用它的经验。有没有人有尝试做类似事情的经验?或者有关如何实现这一目标的更好的想法?

我应该补充一点,我们的应用程序是独立的,不能在任何J2EE容器中运行,因此任何特定于容器的连接管理技术可能都不是特别有用。

3 个答案:

答案 0 :(得分: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 Context Factory必须可用但我从未使用它。使用的大多数类都在javax.naming包中。

希望这有帮助。

答案 1 :(得分:0)

您试图遵守哪些规定?

您可以做的一件事是依赖于通过JNDI公开的数据源。但是,这意味着您的连接设置位于数据源配置的站点。

我怀疑你需要与数据库连接设置“横向”。您是否认为在一个地方设置设置会给您的应用带来风险?

答案 2 :(得分:0)

坚持使用XML /属性文件方法可能更简单,但使用某种集中式配置管理系统来控制这些文件的内容。

大概如果你不得不考虑集中数据源配置之类的东西,你就已经有了一些东西(CFEngine,puppet,chef,rdist,...)来管理操作系统配置文件 - 所以为什么不用它呢?是什么?