如何使用JNDI将java应用程序连接到数据库?

时间:2014-06-27 16:12:42

标签: java jdbc jndi

我正在实现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文件中定义,如果是,我们在哪里指定它以及它的格式是什么?

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

由于

2 个答案:

答案 0 :(得分:3)

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

当您执行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()调用返回一个DataSource(也可能是自定义)。

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

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

所以,既然你是独立的而不是Java EE容器,我认为你真正的答案是你的用例不适合DataSource(除非你转移到像Spring这样提供一个框架的框架)。 / p>

答案 1 :(得分:1)

这是herehere

的精彩教程

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

对命名服务here

的一个很好的介绍