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;
}
}
クラスタに2つのjvmsがあります。クラスタにjvmごとに1つのインスタンスがある場合は問題ありません。しかし、2分と5分の負荷試験は、この方法が7回と12回呼ばれることを示した。 3万のリクエストに対して、私は4つのjvmsで約100の接続タイムアウトを得ました。だから私の意図は、これらの接続タイムアウトを避けることです。静的クラス/メソッド/変数を使用してjvmごとにインスタンスを1回だけ確保できる方法はありますか? – Gokul
デフォルトでは、Spring Beanはシングルトンです。つまり、JVMごとに1回しか存在しません。 'getUserName()'と 'getPassword()'を 'synchronized'とマークした場合、' readAuth() 'はユーザ名またはパスワードが' null'またはSpringコンテキストがリロードされる以外はBeanごとに1回だけ呼び出されます。 – andih