我有一个Spring bean,它引用连接工厂来访问J2C资源。此代码部署在2个jvms负载均衡的webSphere服务器中。我在bean xml中将readAuth方法作为init方法,但在负载测试期间多次调用它。由于Spring单例是每个容器的每个bean,我假设有多个容器导致它多次加载。所以我删除了init-method并将用户名和密码更改为static,并在get方法中添加了null check。但是现在,readAuth方法被多次调用。我想确保每个jvm只调用一次此方法,因为此方法访问服务器资源和连接在负载测试期间超时。 请建议如何写这门课的最佳方法。提前谢谢。
<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 :(得分:0)
如果您想要一次访问资源,单身人士或静态方法无法提供帮助,因为群集的每个成员都拥有自己的类实例。
请记住,Spring specification的Java EE规范都没有定义任何类型的集群行为。您需要搜索特定的供应商解决方案才能实现此类要求。作为示例,请参阅@ApplicationScped in a cluster。
归档预期行为的其他方法是使用像Zookeeper这样的分布式锁,甚至可能使用duplicate message filter的队列。