【发布时间】:2015-05-03 18:39:40
【问题描述】:
我想创建所有系统数据库用户共享的会话工厂。由于会话工厂是重组件,因此每次用户登录应用程序时都创建它是不对的。
我的情况是,我有一个由系统数据库用户登录的应用程序,即 Mysql 数据库用户而不是应用程序用户。所以我需要一个会话工厂,它只能创建一次并供所有系统数据库用户使用。
有可能吗?
【问题讨论】:
标签: java mysql hibernate sessionfactory
我想创建所有系统数据库用户共享的会话工厂。由于会话工厂是重组件,因此每次用户登录应用程序时都创建它是不对的。
我的情况是,我有一个由系统数据库用户登录的应用程序,即 Mysql 数据库用户而不是应用程序用户。所以我需要一个会话工厂,它只能创建一次并供所有系统数据库用户使用。
有可能吗?
【问题讨论】:
标签: java mysql hibernate sessionfactory
是的,这是可能的。您可以创建一个具有SessionFactory 静态对象的类。假设这个类有一个static 块,这样当类加载到JVM 时它只会执行一次。在static 块中,您必须初始化SessionFactory,当您想使用sessionFactory 时,您可以调用sessionFactory 对象的getter。
public final class SessionFactoryHelper {
private static SessionFactory sysDBUserSessionFactory;
static {
try {
// initialize the sysDBUserSessionFactory object.
} catch (Exception e) {
//exception handling
}
}
public static SessionFactory getsysDBUserSessionFactory() {
return sysDBUserSessionFactory;
}
}
只要您希望 sessionFactory 供系统数据库用户使用:
SessionFactory sessionFactory = SessionFactoryHelper.getsysDBUserSessionFactory();
【讨论】:
SessionFactoryHelper 加载到JVM 时完成的。因此,当需要构建会话工厂时,您不必担心它会在应用程序加载时构建。
<string,SessionFactory> 的静态映射其中关键部分是用户名,值是它各自的sessionFactory 对象。但是对于这种方法,您必须确保不会有大量数据库用户,否则应用程序变得如此繁重,只能维护对象:)