我有一个网络应用程序需要两个设置:

  • JDBC数据源
  • 一串令牌

我拼命地想要能够部署一个。战争的各种不同的容器(码头、tomcat gf3最低)和配置这些设置用水平在容器内。

我的代码这样的:

InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")

让我们假设,我已经使用了我们的管理界面,以创建两个jdbc资源:jdbc/试验数据源和jdbc/现场数据库连接不同的副本相同的模式,在不同的服务器上,不同的凭据等。说我要部署这样对我们与,并指出它在测试的数据源,我可能会有这样的我sun-web.xml:

...
<resource-ref>
  <res-ref-name>jdbc/datasource</res-ref-name>
  <jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...

  • sun-web.xml 去 内部 我的战争,对吗?
  • 当然,必须有一种方法来这样做,通过管理接口

我甚至想做正确的事情吗?做的其他容器让这任何容易?我要特别感兴趣的是如何码头7处理这个因为我使用它,用于发展。

编辑 Tomcat有一个合理的方式做到这一点:

创建 $TOMCAT_HOME/conf/Catalina/localhost/webapp.xml 有:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
  <!-- String resource -->
  <Environment name="token" value="value of token" type="java.lang.String" override="false" />

  <!-- Linking to a global resource -->
  <ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />

  <!-- Derby -->
  <Resource name="jdbc/datasource2"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
    url="jdbc:derby:test;create=true"
    />

  <!-- H2 -->
  <Resource name="jdbc/datasource3"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.h2.jdbcx.JdbcDataSource"
    url="jdbc:h2:~/test"
    username="sa"
    password=""
    />
</Context>

注意, override="false" 意味着相反的。这意味着该设置 不可能复盖 通过 web.xml.

我喜欢这做法因为该文件是一部分 容器 配置没有战争,但它不是部分的全球性结构;它的网络应用程序特有的。

我猜我希望多一点,从我们既然是应该有一个完整的网络管理员的接口,但是我会很高兴有足够的东西相当于上述情况。

没有正确的解决方案

其他提示

为GF v3,你可能想试图利用--deploymentplan选择的部署子命令的asadmin.这是上讨论过的 人页对部署命令.

我们刚刚这个问题时迁移的自Tomcat以下3.这里是我为我们工作。

  • 在我们的管理控制台,配置数据源(JDBC连接池和资源)为DEV/TEST/PROD/等。
  • 记录你的部署时间参数(在我们的情况的数据库连接信息)在"属性"的文件。例如:
# Database connection properties
dev=jdbc/dbdev
test=jdbc/dbtest
prod=jdbc/dbprod
  • 每个网络的应用程序可以负载相同的数据库性文件。
  • 查找JDBC资源如下。

import java.sql.Connection;
import javax.sql.DataSource;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * @param resourceName the resource name of the connection pool (eg jdbc/dbdev)
 * @return Connection a pooled connection from the data source 
 * associated with resourceName
 * @throws NamingException will be thrown if resource name is not found
 */
 public Connection getDatabaseConnection(String resourceName) 
             throws NamingException, SQLException {
    Context initContext = new InitialContext();
    DataSource pooledDataSource = (DataSource) initContext.lookup(resourceName);
    return pooledDataSource.getConnection();
 }

注意,这是 通常的两个步骤的过程,涉及一看使用的命名方面的"java:comp/env." 我不知道如果这个工作中应用的容器比其他GF3,但在GF3没有必要增加资源的描述web.xml 在采用上述方法。

我不确定真正理解这个问题/问题。

作为一个 应用程序的成分供应商, 你宣布的资源(s)需要通过应用程序 一个标准的方式 (容器无关的)在 web.xml.

在部署时间, 应用程序部署人员和管理员 是应该遵循提供的说明 应用程序的成分供应商 要解决外部的依赖(除其他事项)例如通过创建一个数据源的应用程序服务器一级和映射它的真正参要的资源使用的应用程序通过使用一个特定的应用程序服务器的部署描述(例如的 sun-web.xml 对于下面).显然,这是一个 具体的容器 步骤,因此不涵盖通过Java EE规范。

现在,如果你想改变该数据库应用程序的使用,只要:

  • 改变映射应用服务器的部署描述或
  • 修改配置的现有数据源,使它指在另一个数据库。

具有管理界面并没有真正改变任何东西。如果我错过了什么,请不要犹豫让我知道。和公正的情况下,也许有一个看看 以前这个回答.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top