【问题标题】:How to connect java application to database using JNDI?如何使用 JNDI 将 Java 应用程序连接到数据库?
【发布时间】:2014-06-27 16:12:41
【问题描述】:

我正在实现 JNDI 概念以连接到数据库。我用谷歌搜索了起点,但没有得到它。

我想做的是有一个简单的 java 独立应用程序,它使用 JNDI 概念来连接到数据库。

我拥有的样本来源是:

DataSource dataSource = null;

Context context = null;





    try {       

        context = new InitialContext();

        dataSource = (DataSource) context.lookup("database_connection");
        }

    catch (NamingException e) {

            System.out.println("Got naming exception, details are -> " + e.getMessage());

        }

现在,我们在哪里定义 database_connection?是在 xml 文件中定义的,如果是,我们在哪里指定它以及它的格式是什么?

如果可以提供任何指针,那就太好了。

谢谢

【问题讨论】:

    标签: java jdbc jndi


    【解决方案1】:

    您的问题与示例之间的真正区别在于您使用的是独立的 Java 应用程序。几乎每个示例都假定您在 Java EE 应用程序容器中运行。在这种情况下,您定义与容器的数据库连接,使用 JNDI 获取 DataSource,并从中获取连接。

    当您执行 JNDI 查找以获取数据源时,JNDI 框架会查找初始上下文工厂(实现 InitialContextFactory 的类)。在您的 Java EE 应用程序中,容器提供了它。在您的独立 Java 应用程序中,初始上下文为空,并且没有进一步的查找正确解析。

    解决此问题的方法之一是创建自己的初始上下文工厂:

    public class MyContextFactory implements InitialContextFactory
    

    并在启动时将其注入 JNDI:

    System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "mypackag.MyContextFactory");
    

    然后从 getInitialContext 调用返回一个新的 ObjectFactory,然后实现 ObjectFactory 从 getConnection() 调用返回一个 DataSource(也可能是自定义的)。

    这一切都会奏效,但它是矫枉过正。使用普通的 JDBC 连接字符串方法直接在应用程序中获取连接比尝试使用 DataSource 更容易。或者使用 Spring 之类的框架为您注入它或将数据库连接信息与代码分离(在这种情况下,您使用的是 Spring 配置文件而不是直接使用 JNDI)。

    我提倡创建自定义上下文工厂和数据源方法的一个原因是,如果您有想要在 Java EE 应用程序和独立应用程序中运行的通用 JPA 代码(否则配置起来并不简单相同的代码来做这两者)。这听起来不像你的情况。

    因此,由于您是独立的,而不是在 Java EE 容器中,我认为您的真正答案是您的用例不适合 DataSource(除非您迁移到像 Spring 这样可以提供的框架)。

    【讨论】:

    • 非常感谢您的宝贵意见。我想强调它是如何工作的,并且想在没有容器帮助的情况下做到这一点。非常感谢您在这里的帮助。
    【解决方案2】:

    herehere 有一个很好的教程

    数据库应该定义在某个地方(LDAP)?有一系列旧文章使用带有 JNDI 的目录服务(最终在您的情况下获取服务器信息)here

    关于命名服务的精彩介绍here

    【讨论】:

    • 感谢您的指点。到目前为止,考虑到 JEE 领域中添加了如此多的新技术,JNDI 是否仍在使用。
    • @vipinkoul Naming 最初是他们将资源移动到类似云的环境中的方式,因此您不必知道事物所在的位置,并且可以毫不费力地移动它们。这个想法是让一个名称在运行时解析到一个位置(有点像资源 DNS)。有些商店在这方面投入巨资,有些则没有。不得不说,好久没看到了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2014-07-08
    • 2019-06-16
    相关资源
    最近更新 更多