2015-02-20 6 views
2

Я создал собственный класс поставщика фабрики сеансов. Где я устанавливаю свойства спящего режима и аннотированные классы. У меня более 100 аннотированных классов. В то время как я являюсь логином для приложения, требуется много времени для загрузки фабрики сеансов. Есть ли способ преодолеть эту проблему или я ошибаюсь? Пожалуйста, помогите мне.Hibernate Session Factory занимает много времени, чтобы загрузить

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 

    } 

} 

ответ

0

Не пытайтесь создать фабрику сеансов для каждого пользователя. Настройте пользователя системной базы данных, который используется приложением для подключения к базе данных. Ваша заявка должна содержать только одну фабрику сеансов.

Инициализируйте заводскую сессию во время запуска приложения. Если это веб-приложение, вы можете сделать это с помощью сервлета запуска.

+0

Это нормально, но мне нужно войти в приложение через пользователя системной базы данных и поддерживать разные подключения для каждого пользователя. – Balkrushn

+1

Мы столкнулись с аналогичной проблемой с приложением, которое настаивало на использовании пользователей базы данных. В итоге нам пришлось использовать стандартный JDBC. Мы создали собственный пул соединений для обработки различных подключений. Это, конечно, делает пул соединений очень неэффективным, так как теперь у вас есть одно или несколько подключений для каждого пользователя, а не для совместного использования пула соединений. –

1

Поскольку вы уже используете Spring (например, LocalSessionFactoryBean), вы должны configure the application context, так что LocalSessionFactoryBean является одноэлементным.

Поэтому нет необходимости создавать SessionFactory вручную. Это также относится к конфигурации управления транзакциями.

Согласно reference documentation, то SessionFactory дорогостоящий объект и так как это объект поточно, он должен быть синглтон вместо:

SessionFactory является дорогой к создавать, поточно-объект, предназначен для совместного использования всеми потоками приложений. Он создается один раз, обычно при запуске приложения, из экземпляра Configuration.

+0

Что делать, если я хочу войти в приложение, используя учетную запись системной базы данных, поддерживая единую сессионную фабрику и другое соединение? – Balkrushn

+0

Итак, что вас удерживает? У вас может быть одна фабрика сеансов и несколько соединений. –

+0

Да, я знаю это, но как создать единую сессионную фабрику, пока у меня есть пользователи системной базы данных для входа в приложение, не являющееся пользователем приложения. – Balkrushn