【问题标题】:Out of container JNDI data source容器外 JNDI 数据源
【发布时间】:2010-12-09 13:57:15
【问题描述】:

我想在 Java SE 应用程序中使用 JNDI 配置数据源。最好的方法是什么?

到目前为止,我遇到了 2 个项目:

  1. Apache Naming。项目页面有一个配置数据源的具体示例,但看起来该项目非常老旧,不再处于活动状态。
  2. JBossNS。使用LocalOnlyContextFactory 配置仅限本地的 JNDI 看起来很容易,但我还没有找到任何有关如何实际配置数据源的文档。

如果可能,我还想使用 JTA 事务管理器(使用 JOTM?)配置数据源。

【问题讨论】:

    标签: java datasource jndi


    【解决方案1】:

    您为什么要为此使用 JNDI?如果您有提供程序,这并不是一个糟糕的解决方案,但还有其他替代方案,例如依赖注入(IoC:通过SpringGuice)。

    Spring JDBC 数据访问描述为here。很棒的是,您可以使用 Spring 将DataSource 注入您的代码中:

    <bean class="com.my.Persister">
        <property name="dataSource" ref="dataSource" />
    </bean>
    

    可以使用 JNDI 查找来定义数据源:

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" /> 
    

    在测试环境中,可以直接注入数据源:

    <bean id="dataSource" class="apache.db.PoolingDataSource">
        <!-- config goes here -->
    </bean>
    

    【讨论】:

    • 我应该在帖子中提到这一点。我正在编写一个将在 Web 应用程序中运行的组件,但我也希望能够从普通的 Java SE 命令行应用程序和 JUnit 测试中调用它。我最初的想法是我应该能够设置必要的环境(JNDI、DBCP、JTA),以便组件代码始终可以依赖这些环境。我不愿意在应用程序中引入一个全新的框架,例如 Spring,但这可能是一种选择。您会推荐与此相关的特定 Spring 文档页面吗?
    • 我已经编辑了答案以提供链接和一些指示。 Spring JDBC 很强大
    • 感谢您提供详细信息。我没有足够的分数将答案标记为有用:|
    【解决方案2】:

    这些参考资料已经很老了,但可能有助于使用 jnpserver(JBoss 命名服务提供者):

    【讨论】:

      【解决方案3】:

      一个非常易于使用的独立 JNDI 解决方案是simple-jndi。只要您只在单个 JVM 中需要它,它就像一个魅力,因为它是一个没有网络服务器的库。

      【讨论】:

        【解决方案4】:

        klenkes74 引用的 Simple-JNDI 版本不再处于积极开发中。因为我遇到了一些问题,所以我分叉了它,修复了一些错误并实现了一些新功能。我已经将旧版本不仅用于测试,还用于生产,因为我更喜欢服务定位器模式而不是依赖注入,尽管后者现在更流行。

        您可以轻松地使用 Simple-JNDI 以声明方式定义数据源或连接池,并将其绑定到 JNDI 上下文。

        在你的类路径中定义一个 jndi.properties 文件:

        java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
        org.osjava.sj.root=[absolute_or_relative_path_to_a_property_file]
        

        属性文件如下:

        type=javax.sql.DataSource
        driver=org.gjt.mm.mysql.Driver
        url=jdbc:mysql://localhost/testdb
        user=testuser
        password=testing
        

        现在您可以通过这种方式从代码内部访问您的数据源:

          InitialContext ctxt = new InitialContext();
          DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource");
        

        欲了解更多信息,请参阅https://github.com/h-thurow/Simple-JNDI

        【讨论】:

        • 感谢您将叉子添加到此答案中。我用你的叉子有一段时间了。但是我在 DI 模式下使用它(我将 JNDI 提供给 DI 框架并使用 simple-jndi 配置文件来轻松配置非容器软件,以使用户远离 DI 提供程序配置文件。
        猜你喜欢
        • 2010-09-07
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2013-05-04
        • 2016-01-30
        • 2019-05-15
        相关资源
        最近更新 更多