Java EE コンテナーとして GlassFish 3.1.2 を使用して、Hibernate 4.1.7 および EJB 3.1 でマルチ テナント アプリケーションを実装する問題に直面しています。このコードでログインしているユーザー:
@Override
public String resolveCurrentTenantIdentifier() {
try {
SessionContext context = ServiceLocator.locate(SessionEjbContext.class).getSessionContext();
String userName = context.getCallerPrincipal().getName();
AppLogger.info("current tenant identifier [" + userName + "]");
return userName;
} catch (Throwable e) {
AppLogger.info("erro lookup");
}
return "default";
}
SessionContext.class はそのように実装されています
@Stateful
@SessionScoped
public class SessionEjbContext {
@Resource
private SessionContext sessionContext;
public SessionContext getSessionContext() {
return sessionContext;
}
}
次に、メソッド ConnectionProvider selectConnectionProvider(String tenantIdentifier) を実装し、使用する c3p0 ConnectionProvider オブジェクトを返す必要がある org.hibernate.service.jdbc.connections.spi.AbstractMultiTenantConnectionProvider を拡張するクラスに ID が提供されます。
本当の問題は次のとおりです。ユーザー user1 がシステムを認証すると、db 接続は正常に解決されます。しかし、user2 が認証されると、メソッド ConnectionProvider selectConnectionProvider(String tenantIdentifier) がパラメーターとして user2 ではなく user1 を受け取るため、user1 と同じデータベースを選択することになります。
EntityManager は PersistenceContextType.EXTENDED アノテーションで実装されていますが、それが問題の原因ですか? 最初のユーザーに関する情報を再利用している可能性があります。