如何在Tomcat 7中配置jndi DataSource

时间:2015-02-06 14:35:08

标签: tomcat7 jndi

我需要在tomcat 7中部署我们的Web应用程序。但我的应用程序使用JNDI数据源。如何在Tomcat 7中创建jndi DataSource

2 个答案:

答案 0 :(得分:0)

您是否尝试过Tomcat手册:http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

(提示:Google String是“jndi datasource tomcat 7”)

答案 1 :(得分:-1)

我可以显示如何在Tomcat 9中执行此操作。这可能会或可能不会在Tomcat 7中起作用。FYI,Tomcat 7 seems to be中的maintenance-mode

在我的情况下,我想存储Web应用程序的WAR文件的设置,例如数据库访问信息外部。这为我的每个开发,测试和生产服务器提供了灵活性,使其在文件系统中拥有自己的设置。与运行我的应用程序的客户一样。如果这些设置保存在外部,并且分别存在于每个服务器上,则无需编辑WAR文件或生成个性化的WAR文件。而且,当设置更改或新版本的WAR文件到来时,无需重新编辑WAR文件。

在Tomcat“ home”文件夹或Tomcat“ base”文件夹(如果已指定)中,进入conf文件夹以创建Catalina文件夹。 “ Catalina”是Tomcat引擎的名称。在名为您主机名的localhost的新文件夹中嵌套。在其中创建一个XML文件,命名为上下文名称。

我发现app-name-goes-here.xml方法是将这些设置存储在我的Web应用程序的WAR文件外部的简单位置,而不必弄乱Tomcat自己的文件。在 Tomcat配置参考The Context Container页的定义上下文部分中的中间符号“开始于单独的文件”中,很明显地记录了这种方法。 / p>

例如,这是我的应用程序 TickTock 的屏幕截图,使用的是Tomcat文件夹外部的“基本”文件夹。

screenshot of "base" folder > "conf" > "Catalina" > "localhost" > ticktock.xml

在该XML文件中,您可以定义诸如环境变量之类的东西,例如“ DEV”与“ PROD”标志或feature toggle,以及要实例化的资源(例如JDBC DataSource)。这些项目由Tomcat自己的类似LDAP的服务器实现管理,可以通过JNDI进行访问。

这是我的ticktock.xml文件的几乎真实的示例。

注意每个属性的前几个属性;这些是Servlet规范定义的标准,在此处为environment entriesresource entries进行了文档记录。

并注意Resource元素如何具有其他属性。这些是特定的特定资源。在这种情况下,特定资源为this Postgres JDBC driver

<Context>

    <!-- Domain: DEV, TEST, PROD -->
    <Environment
            name = "work.basil.ticktock.deployment-mode"
            description = "Signals whether to run this web-app with development, testing, or production settings."
            type = "java.lang.String"
            value = "DEV"
            override = "false"
            />

     <Resource
             name = "jdbc/ticktockdb"
             description = "Database used by the TickTock app."
             type = "javax.sql.DataSource"
             auth = "Container"
             singleton = "true"

             driverClassName = "org.postgresql.Driver"
             url = "jdbc:postgresql://127.0.0.1:5432/ticktockdb"
             username = "TickTockApp"
             password = "pw"
             maxTotal = "20"
             maxIdle = "10"
             maxWaitMillis = "-1"
             />

</Context>

如何为此环境条目或资源条目获取对象?

首先,获取一个JNDI“上下文”,从中可以访问这些条目。

Context ctx = new InitialContext ();

您还将需要为任何NamingException设置陷阱,但是我将省略该代码。

您可以使用此简单代码转储所有环境条目。我在这里使用lambda语法,但是您也可以使用经典的Java语法。

// Read all properties.
System.out.println ( "INFO - Dumping bindings for environment variables." );
ctx.listBindings ( "java:comp/env" ).asIterator ().forEachRemaining (
        ( Binding binding ) -> {
            String msg = binding.getName () + " : " + binding.getObject ();
            System.out.println ( msg );
            this.add ( new Paragraph ( msg ) );
        } );

或获取特定的内容。

String deployMode = ( String ) ctx.lookup( "java:comp/env/work.basil.ticktock.deployment-mode" );

要获取DataSource对象,必须转换JNDI返回的Object

DataSource ds = ( DataSource ) ctx.lookup( "java:/comp/env/jdbc/ticktockdb" );

这就是我们所需要的!

您将看到有关其他配置的Servlet或Tomcat功能的其他配置的其他讨论,这些功能提供了另一层间接性,因此代码中的命名不需要与LDAP或JNDI访问的其他服务器中的名称匹配。虽然我不确定,但是我相信如果我们的Web应用程序项目不需要额外的间接层,那么如果我们指定整个JNDI查找字符串,则可以直接从命名服务器提供我们的环境或资源请求,如下所示,以java:/comp/env开头,而不仅仅是结尾jdbc/ticktockdb。如果有人想澄清这一点,请发表评论或编辑此答案。

JDBC驱动程序

JDBC drivers在Servlet容器中有问题。长话短说,您应该将JDBC驱动程序与Web应用程序捆绑在其WAR文件中。

相反,您想在 Common 类加载器或 Shared 类加载器上加载JDBC驱动程序。为了使 Common 类加载器自动检测JDBC驱动程序,请将其JAR文件拖放到Tomcat的lib文件夹中(或者使用上面指定的“基本”文件夹,如上所示创建一个lib文件夹,并将驱动程序的JAR存放在此处)。