【问题标题】:Hibernate Session factory shared by system database users系统数据库用户共享的休眠会话工厂
【发布时间】:2015-05-03 18:39:40
【问题描述】:

我想创建所有系统数据库用户共享的会话工厂。由于会话工厂是重组件,因此每次用户登录应用程序时都创建它是不对的。

我的情况是,我有一个由系统数据库用户登录的应用程序,即 Mysql 数据库用户而不是应用程序用户。所以我需要一个会话工厂,它只能创建一次并供所有系统数据库用户使用。

有可能吗?

【问题讨论】:

    标签: java mysql hibernate sessionfactory


    【解决方案1】:

    是的,这是可能的。您可以创建一个具有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 时完成的。因此,当需要构建会话工厂时,您不必担心它会在应用程序加载时构建。
    • 是的,我知道,但是,在第一个用户之后登录的用户使用的是第一个用户使用的相同连接。是否可以按原样创建新的连接保持会话工厂。即不再建立会话工厂,而只是更改用户用于登录的连接用户名和密码。
    • 我猜不,为 Hibernate SessionFactory 创建实例的过程是一项昂贵的操作,但如果您有有限的系统数据库用户,比如说(最多 10 个),那么您可以维护 <string,SessionFactory> 的静态映射其中关键部分是用户名,值是它各自的sessionFactory 对象。但是对于这种方法,您必须确保不会有大量数据库用户,否则应用程序变得如此繁重,只能维护对象:)
    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 2011-02-01
    • 2015-03-18
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多