【问题标题】:How to select JNDI based on environment如何根据环境选择JNDI
【发布时间】:2016-08-18 17:35:03
【问题描述】:

是否有可能根据包含要链接到哪个环境的变量的值来选择 JNDI 资源?

例如,在我的域中,我有 3 个环境:DEV、QA 和 STAGE。我有一个名为 EcommReporting 的数据库,每个环境都存在该数据库。为此,在我的 tomcat 服务器的 server.xml 文件中,我为 DEV_EcommReportingQA_EcommReportingSTAGE_EcommReporting 设置了单独的条目。

问题是,我的代码是否可以通过某种方式请求名为 EcommReporting 的 JNDI 资源并提供环境名称,然后根据这两个细节返回正确的资源?

现在我正在使用 Spring 定义一个数据源 bean:

   <bean id="EcommReportingDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/EcommReporting"/>
    </bean>

然后在我的 Tomcat 服务器的 context.xml(仅显示 QA 版本)中,我有这个:

<ResourceLink name="jdbc/EcommReporting"
                global="jdbc/QA_EcommReporting"
                auth="Container"
                type="javax.sql.DataSource" />

最后,在我的 Tomcat 服务器的 server.xml 中,我定义了 JNDI 资源如下:

<Resource name="jdbc/QA_EcommReporting" 
      global="jdbc/QA_EcommReporting" 
      auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://URLHERE.COM:3311/REPORTING" 
      username="username_here" 
      password="password_here" 

      maxActive="100" 
      maxIdle="20" 
      minIdle="5" 
      maxWait="10000"/>

广告

【问题讨论】:

  • 不清楚你想要什么,你有 3 个 tomcat 实例,你希望能够从不同的 JVM 访问这 3 个实例使用的数据源,这是你想要的吗?

标签: java xml spring tomcat jndi


【解决方案1】:

您可以使用 Spring 配置文件做一些事情。目前尚不清楚确切的设置是什么:听起来所有 3 个 WAR 都部署到同一台服务器上?如果是这样,您将需要动态设置活动配置文件。我能想到的一种方法是使用 ServletContextListener 并检查已部署应用程序的路径。

基本上然后您创建三个数据源 bean 并将它们与特定配置文件相关联。此处概述了此过程:

https://spring.io/blog/2011/02/11/spring-framework-3-1-m1-released/

<beans profile="dev">
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/Dev_EcommReporting"/>
</beans>
<beans profile="qa">
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/QA_EcommReporting"/>
</beans>

然后您可以创建一个 ServletContextListener 并根据路径设置活动配置文件。

    @Override
    public void contextInitialized(ServletContextEvent event) {

       ServletContext context = event.getServletContext();

       if(context.getContextPath().equals("/dev"){
           servletContext.setInitParameter("spring.profiles.active", "dev");
       } else if(context).getCOntextPath().equals("/qa"){
           servletContext.setInitParameter("spring.profiles.active", "qa");
       }
    }

更多信息在这里:

https://www.mkyong.com/spring/spring-profiles-example/

如果所有应用都部署到不同的服务器,那么只需使用 -Dspring.profiles.active=xyz 启动服务器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多