如何在Tomcat 7中配置jndi数据源

问题描述 投票:-1回答:2

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

tomcat7 jndi
2个回答
1
投票

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

(提示:Google String是“ jndi数据源tomcat 7”)


-1
投票

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

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

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

[我发现app-name-goes-here.xml方法是将这些设置存储在我的Web应用程序的WAR文件外部的简单位置,而不必弄乱Tomcat自己的文件。在[[Tomcat配置参考的The Context Container页面的[[定义上下文]]部分中,在“在单独的文件中”开头的中间项目符号中,这种方法相当晦涩难懂。例如,这是我的名为TickTock的应用的屏幕快照,使用Tomcat文件夹外部的“基本”文件夹。

screenshot of "base" folder > "conf" > "Catalina" > "localhost" > ticktock.xml在该XML文件中,您可以定义诸如环境变量之类的东西,例如“ DEV”对“ PROD”标志或feature toggle,以及诸如JDBC DataSource单例之类的资源。这些项目由Tomcat自己的类似DataSource的服务器的实现管理,可以通过LDAP访问。

[这是我的JNDI文件的几乎真实的示例。

注意每个属性的前几个属性;这些是Servlet规范定义的标准,在此为ticktock.xml和此处为environment entries记录。

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

this Postgres JDBC driver

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

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

<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>

您还将需要为Context ctx = new InitialContext (); 设置陷阱,但是我将省略该代码。

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

NamingException

或获取特定的。

NamingException

要获得// 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 ) ); } ); 对象,我们必须转换JNDI返回的String deployMode = ( String ) ctx.lookup( "java:comp/env/work.basil.ticktock.deployment-mode" );

DataSource

这就是我们所需要的!

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

JDBC驱动程序

java:/comp/env在Servlet容器中有问题。长话短说,您应该

not将JDBC驱动程序与Web应用程序捆绑在其WAR文件中。

相反,您想在Common类加载器或可能的

Shared

类加载器上加载JDBC驱动程序。为了使Common类加载器自动检测您的JDBC驱动程序,请将其jdbc/ticktockdb文件拖放到Tomcat的JDBC drivers文件夹中(或者,如果使用上面指定的“ base”文件夹,请创建一个JAR文件夹,如下所示:如上所示,然后在此处存放驾驶员的JAR)。
© www.soinside.com 2019 - 2024. All rights reserved.