2017-12-08 15 views
5

簡体状況:のTomcat:1戦争、配備さ2倍、2つのコンフィグ

  • は、私は1つのTomcatコンテナとデータベースを使用して1つのWARを持っています。
  • データベース設定は、プロパティファイル(戦争中)にあります。
  • 私は、コンテキストパス/aに1つのwebapp、コンテキストパス/bに1つのwebappを2回配備しました。
  • 両方のWebアプリケーションは同じデータベース(同じcfg)を指しています。

私が望むのは、各Webアプリケーションが異なるデータベースを指していることです。したがって、/a上のwebappはデータベースを指し、を指し、/bのウェブアプリケーションはデータベースを指します。です。

どうすれば解決できますか? (戦争自体を分割することなく)

+1

なぜ各戦争の構成ファイルを異なるデータベースを指すように変更しないのですか? –

+1

@LukeBajada:1つか2つの財産が異なるからといって、2戦争をするのは好きではない。 – codesmith

+0

@Henry:env変数またはシステムプロパティはシステム全体にわたり、したがってコンテナ全体であり、したがって戦争固有ではありません。説明してください。 – codesmith

答えて

9

あなたのコードを分割することなくTomcatのcontext.xml設定で行うことができます。

あなたは一例/a/b 2つの異なるグローバルデータソース「sharedDataSourceA」「sharedDataSourceB」ための2つのコンテキストを定義することができます。別のグローバルデータソースを「appDataSource」のような同名のコンテキストにバインドすることができます。

<GlobalNamingResources> 
    ... 
    <Resource name="sharedDataSourceA" 
      global="sharedDataSourceA" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      alternateUsernameAllowed="true" 
      username="bar" 
      password="barpass" 
      ... 
<Resource name="sharedDataSourceB" 
      global="sharedDataSourceB" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      alternateUsernameAllowed="true" 
      username="bar" 
      password="barpass" 
      ... 
    ... 
</GlobalNamingResources> 

<Context path="/a"...> 
    ... 
    <ResourceLink 
      name="appDataSource" 
      global="sharedDataSourceA" 
      type="javax.sql.DataSource" 
      factory="org.apache.naming.factory.DataSourceLinkFactory" 
      username="foo" 
      password="foopass" 
    ... 
</Context> 
<Context path="/b"...> 
    ... 
    <ResourceLink 
      name="appDataSource" 
      global="sharedDataSourceA" 
      type="javax.sql.DataSource" 
    ... 
</Context> 

は、次に、あなたのコードでは、JNDIルックアップによって"appDataSource"にデータソースをバインドすることができます。同じ戦争を/a/bに配備する。彼らは別のデータベースで動作します。

2

現在のコンテキストをプログラムで取得し、得られた値に従ってデータソースを構成することができます。たとえば、javax.servlet.ServletContext.getContextPath()を使用します。

また、コンテキスト名に従ってプロパティファイルを読み込むこともできます。 indentical両方 - - と "の/ dev" と "/PROD":あなたは2つのコンテキストを持っていた場合

0

getContextPath()は、提案され、ここでは一例としてgetInitParameter()

でそれを使用する技術であるました

<context-param> 
    <param-name>database_ip_prod</param-name> 
    <param-value>192.168.1.10</param-value> 
</context-param> 

<context-param> 
    <param-name>database_ip_dev</param-name> 
    <param-value>127.0.0.1</param-value> 
</context-param> 

そして、このような方法で:

次のようなエントリを使用して のweb.xmlファイルを設定しました
public String getContextInitParam(
     javax.servlet.ServletContext context, String key) { 
    key += context.getContextPath().replace("/","_"); 
    return context.getInitParameter(key); 
} 

JSPまたはサーブレットからこのような呼び出し:

getContextInitParam(要求。getServletContext()、"database_ip");

/PROD文脈上192.168.1.10を返し、の/ dev文脈上127.0.0.1でしょう。

関連する問題