如何使用JNDI连接数据库来连接Java应用程序?

4

我正在实现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());

        }

现在问题来了,我们如何定义数据库连接?这是在xml文件中定义的吗?如果是,在哪里指定该文件,并且它的格式是什么?
如果能够提供任何指针,那就太好了。
谢谢。
2个回答

3

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

当您进行JNDI查找以获取您的DataSource时,JNDI框架会查找初始上下文工厂(实现InitialContextFactory的类)。在您的Java EE应用程序中,容器提供了它。在您的独立的Java应用程序中,初始上下文为null,没有进一步的查找能够正确地解决。

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

public class MyContextFactory implements InitialContextFactory

并在启动时将其注入到 JNDI 中:

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

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

这样做完全可行,但过于复杂了。与其尝试使用数据源来获取连接,不如直接在应用程序中使用常规的JDBC连接字符串方法直接获取连接。或者使用像Spring这样的框架为您注入它,或将数据库连接信息与代码分离(在这种情况下,您使用的是Spring配置文件而不是直接使用JNDI)。

我提倡创建自定义上下文工厂和数据源方法的唯一原因是,如果您有常见的JPA代码要在Java EE应用程序中运行,并在独立应用程序中运行(否则配置相同的代码既不容易又不能同时运行)。但这似乎不是您的情况。

所以,既然您是独立的而不是在Java EE容器中,那么我认为您的真正答案是:除非您转向像Spring这样的框架(提供一个数据源),否则您的用例不适合使用数据源。


非常感谢您宝贵的意见。我想要加强一下关于这个工作原理的理解,而且希望不借助任何容器来实现。再次感谢您在这里的帮助。 - CuriousMind

1

这里有一个很好的教程在这里在这里

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

关于命名服务的一个不错的介绍在这里


感谢您的指引。截至目前,考虑到JEE领域中不断增加的许多新技术,JNDI仍在使用吗? - CuriousMind
1
@vipinkoul 命名最初是将资源移动到类似云的环境中的方式,因此您不必知道事物所在的位置,并且它们可以在不太费力的情况下移动。这个想法是拥有一个在运行时解析为位置的名称(有点像资源DNS)。一些商店对此进行了大量投资,而其他商店则没有。我必须说,我已经有一段时间没有看到过这样的东西了。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接