2017-05-15 6 views
0

J2Cリソースにアクセスするための接続ファクトリを参照するSpring Beanがあります。このコードは2つのjvmsロードバランスでwebSphereサーバーにデプロイされています。私はbean-xmlのinit-methodとしてreadAuthメソッドを持っていましたが、ロードテスト中に複数回呼び出されました。 Spring SingletonはコンテナあたりBeanであるため、複数のコンテナが複数回ロードされていると想定しました。そこで私はinitメソッドを削除し、ユーザー名とパスワードを静的に変更し、getメソッドにnullチェックを追加しました。しかし、現在は、readAuthメソッドが複数回呼び出されています。このメソッドは、ロード・テスト中にタイムアウトしているため、このメソッドがjvmごとに1回だけ呼び出されるようにしたい。 このクラスの作成方法については、最善の方法を提案してください。前もって感謝します。クラスタのすべてのメンバーは、クラスのそれ自身のインスタンスを持っているので、正確に一度リソースにアクセスしたい場合はSpring Beanサーバーリソースに一度アクセスする方法は?

<bean id="J2CUtils" 
     class="test.J2CUtils"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
    </bean> 
    <jee:jndi-lookup id="connectionFactory" jndi-name="eis/J2CAuth" /> 

public class J2Ctils { 
    private ConnectionFactory connectionFactory; 
    private static String userName; 
    private static String password; 

    private void readAuth() throws ResourceException { 
     System.out.println("Auth loaded"); 
      Connection conn = connectionFactory.getConnection(); 
      Interaction interaction = (Interaction) conn.createInteraction(); 
      Config config = interaction.getConfig(); 
      userName = config.getUserName(); 
      password = config.getPassword(); 
    } 
    public String getUserName() { 
     if(null == userName) { 
      readAuth(); 
     } 
     return userName; 
    } 
    public String getPassword() { 
     if(null == password) { 
      readAuth(); 
     } 
     return password; 
    } 
    public void setConnectionFactory(ConnectionFactory connectionFactory) { 
     this.connectionFactory = connectionFactory; 
    } 
} 

答えて

0

シングルトンや静的メソッドは役立ちません。

Java EE仕様Spring specificationのいずれも、どのような種類のクラスタ動作も定義していないことに注意してください。この種の要件を達成するには、特定のベンダーのソリューションを検索する必要があります。一例として、@ApplicationScped in a clusterをご覧ください。

期待される振る舞いをアーカイブする他のアプローチは、動物園のような分散ロックを使用しているか、場合によってはduplicate message filterのキューを使用しています。

+0

クラスタに2つのjvmsがあります。クラスタにjvmごとに1つのインスタンスがある場合は問題ありません。しかし、2分と5分の負荷試験は、この方法が7回と12回呼ばれることを示した。 3万のリクエストに対して、私は4つのjvmsで約100の接続タイムアウトを得ました。だから私の意図は、これらの接続タイムアウトを避けることです。静的クラス/メソッド/変数を使用してjvmごとにインスタンスを1回だけ確保できる方法はありますか? – Gokul

+0

デフォルトでは、Spring Beanはシングルトンです。つまり、JVMごとに1回しか存在しません。 'getUserName()'と 'getPassword()'を 'synchronized'とマークした場合、' readAuth() 'はユーザ名またはパスワードが' null'またはSpringコンテキストがリロードされる以外はBeanごとに1回だけ呼び出されます。 – andih

関連する問題