3

2 つの設定が必要な Web アプリがあります。

  • JDBC データソース
  • 文字列トークン

1 つの .war をさまざまなコンテナー (jetty、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")

グラスフィッシュ管理インターフェースを使用して 2 つの jdbc リソースを作成したと仮定しましょう: jdbc/test-datasource と jdbc/live-datasource は、同じスキーマの異なるコピー、異なるサーバー、異なる資格情報などに接続します。これをグラスフィッシュに渡し、テストデータソースを指すようにすると、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 は私の戦争の中に入りますよね?
  • 確かに、管理インターフェイスを介してこれを行う方法が必要です

私は正しいことをしようとしていますか?他のコンテナはこれを簡単にしますか? 開発に使用しているため、jetty 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

ファイルは戦争ではなくコンテナ構成の一部ですが、グローバル構成の一部ではないため、このアプローチが気に入っています。それはwebapp固有です。

完全なWeb管理インターフェースを備えているはずなので、glassfishにはもう少し期待していると思いますが、上記と同等のもので十分満足です.

4

3 に答える 3

2

Tomcat から Glassfish 3 に移行するときに、この問題が発生しました。

  • Glassfish 管理コンソールで、DEV/TEST/PROD などのデータソース (JDBC 接続プールとリソース) を構成します。
  • デプロイメント時のパラメーター (この場合はデータベース接続情報) をプロパティー・ファイルに記録します。例えば:
# Database connection properties
dev=jdbc/dbdev
test=jdbc/dbtest
prod=jdbc/dbprod
  • 各 Web アプリは、同じデータベース プロパティ ファイルを読み込むことができます。
  • 次のように 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」を使用したルックアップを含む、通常の 2 段階のプロセスではないことに注意してください。これが GF3 以外のアプリケーション コンテナーで機能するかどうかはわかりませんが、GF3 では、上記のアプローチを使用するときに web.xml にリソース記述子を追加する必要はありません。

于 2010-09-09T19:45:33.837 に答える
2

GF v3 の場合、asadmin の deploy サブコマンドの --deploymentplan オプションを活用してみてください。deploy サブコマンドの man ページで説明されています。

于 2010-03-16T21:55:59.900 に答える
0

質問/問題を本当に理解するかどうかはわかりません。

アプリケーションコンポーネントプロバイダーとして、アプリケーションに必要なリソースを標準的な方法(コンテナーに依存しない)で宣言しますweb.xml

デプロイメント時に、Application DeployerとAdministratorは、アプリケーションサーバーレベルでデータソースを作成し、その実際のJNDI名をリソースにマッピングするなどして、外部の依存関係を解決するために、アプリケーションコンポーネントプロバイダーによって提供される指示に従うことになっています。アプリケーションサーバー固有のデプロイメント記述子( sun-web.xmlGlassFishなど)を使用してアプリケーションが使用する名前。明らかに、これはコンテナ固有のステップであるため、JavaEE仕様ではカバーされていません。

ここで、アプリケーションが使用しているデータベースを変更する場合は、次のいずれかを行う必要があります。

  • アプリケーションサーバーデプロイメント記述子のマッピングを変更します-または-
  • 既存のデータソースの構成を変更して、別のデータベースを指すようにします。

管理インターフェースがあっても、実際には何も変わりません。私が何かを逃したならば、私に知らせることを躊躇しないでください。念のため、この前の回答をご覧ください。

于 2010-03-04T20:50:47.063 に答える