【问题标题】:Hibernate Session Factory taking long time to loadHibernate Session Factory 需要很长时间才能加载
【发布时间】:2015-04-22 00:32:25
【问题描述】:

我创建了自定义会话工厂提供程序类。我在哪里设置休眠属性和带注释的类。我有超过 100 个带注释的类。当我登录应用程序时,加载会话工厂需要很长时间。有什么办法可以克服这个问题或者我做错了什么?请帮帮我。

public class SessionFatoryProvider {

    public void setNewSessionFactory(String uname,String password,HttpSession hs){

        String jdbcUrl = Constants.DB_URL+Constants.DB;
        java.util.Properties hibernateProperties = new java.util.Properties();
        hibernateProperties.setProperty("hibernate.connection.driverClassNames", "com.mysql.jdbc.Driver");
        hibernateProperties.setProperty("hibernate.connection.url", jdbcUrl);
        hibernateProperties.setProperty("hibernate.connection.username", uname);
        hibernateProperties.setProperty("hibernate.connection.password", password);
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        hibernateProperties.setProperty("hibernate.show_sql", "true");
        hibernateProperties.setProperty("hibernate.hbm2ddl.auto","none");
        hibernateProperties.setProperty("current_session_context_class","org.hibernate.context.spi.AbstractCurrentSessionContext");
        hibernateProperties.setProperty("hibernate.cache.use_second_level_cache","false");
        hibernateProperties.setProperty("hibernate.cache.use_query_cache","false");

        LocalSessionFactoryBean slfb = new LocalSessionFactoryBean();
        slfb.setHibernateProperties(hibernateProperties);
        slfb.setPackagesToScan("com.orb.bean"); //My entity class package

        try {
            slfb.afterPropertiesSet();
         } catch (Exception e) {                      
             e.printStackTrace();
         }

        SessionFactory mySessionFactory = slfb.getObject();
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(mySessionFactory);

        hs.setAttribute("HibernateTransactionManager", transactionManager); //Here I am setting hibernate transaction manager in session

    }

}

【问题讨论】:

    标签: java spring hibernate configuration sessionfactory


    【解决方案1】:

    由于您已经使用 Spring(例如 LocalSessionFactoryBean),您应该 configure the application context 以便 LocalSessionFactoryBean 是一个单例。

    因此无需手动创建 SessionFactory。这也适用于事务管理配置。

    根据reference documentation,SessionFactory 是一个昂贵的对象,因为它是一个线程安全的对象,所以它应该是一个单例:

    SessionFactory 是一个创建成本高的线程安全对象, 旨在由所有应用程序线程共享。它被创建一次, 通常在应用程序启动时,从配置实例。

    【讨论】:

    • 如果我想使用系统数据库用户登录应用程序并保持单个会话工厂和不同的连接怎么办?
    • 那么是什么阻碍了你?您可以拥有一个会话工厂和多个连接。
    • 是的,我知道,但是当我让系统数据库用户登录应用程序而不是应用程序用户时,如何创建单个会话工厂。
    • 你需要一个 SessionFactory 到你想连接的数据库模式。如果您的系统用户未映射到实体,则可以使用本机查询。
    【解决方案2】:

    尽量不要为每个用户创建会话工厂。设置应用程序用来连接数据库的系统数据库用户。 您的应用程序应该只包含一个会话工厂。

    在应用程序启动期间初始化您的会话工厂。如果它是一个 Web 应用程序,您可以使用启动 servlet 来执行此操作。

    【讨论】:

    • 没关系,但我需要通过系统数据库用户登录到应用程序,并为每个用户维护不同的连接。
    • 我们在一个坚持使用数据库用户的应用程序中遇到了类似的问题。我们最终不得不使用标准 JDBC。我们建立了自己的连接池来处理不同的连接。当然,这会使连接池变得非常低效,因为您现在每个用户都有一个或多个连接,而不是共享一个连接池。
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2014-08-15
    相关资源
    最近更新 更多