2017-02-06 39 views
2

Недавно я создал веб-службу, которая использует статический метод в Java для получения списка элементов из базы данных.EntityManagerFactory закрыт, Hibernate

Веб-сервис отлично работает и возвращает JSON обратно вызывающему абоненту. Однако он работает только один раз. Если вы попытаетесь обновить или сделать новый запрос, я получаю ошибку EntityManagerFactory is closed.

Вот как класс веб-службы выглядит следующим образом:

public class WebService extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
    //obtain the list of vehicles from the database 
     List<Vehicle> vehicles = ExecuteVehicle.getVehicleList(); 

     //create the Gson object and generate the Json 
    Gson gson = new Gson(); 
     JsonElement element = gson.toJsonTree(vehicles, new TypeToken<List<Vehicle>>(){}.getType()); 

     //send the list of vehicles 
     JsonArray jsonArray = element.getAsJsonArray(); 
     resp.setContentType("application/json"); 
     resp.getWriter().print(jsonArray); 
    } 
} 

Как вы можете видеть, список транспортных средств заселяется с использованием метода ExecuteVehicle.getVehicleList().

Вот как этот метод выглядит следующим образом:

public static List<Vehicle> getVehicleList(){ 

     //open a Session 
     Session session = HibernateUtilities.getSessionFactory().openSession(); 

     //start a transaction 
     session.beginTransaction(); 

     //SELECT STATEMENT for the entire list of Vehicles 
     Query<Vehicle> query = session.getNamedQuery("SelectAllVehicles"); //query name is declared in the mapping file 
     List<Vehicle> vehicles = query.list(); 

     //commit the changes and end the transaction 
     session.getTransaction().commit(); 

     //close the Session 
     session.close(); 

     //close the SessionFactory 
     HibernateUtilities.getSessionFactory().close(); 

     return vehicles; 

    } 

Вот класс HibernateUtilities, который заботится о сессии и так далее:

public class HibernateUtilities { 
    private static SessionFactory sessionFactory; 
    private static StandardServiceRegistry standardServiceRegistry; 

    static{ 
     try { 
      //configure and build the service registry 
      standardServiceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); 

      //create the metadata 
      Metadata metadata = new MetadataSources(standardServiceRegistry).getMetadataBuilder().build(); 

      //build the SessionFactory 
      sessionFactory = metadata.getSessionFactoryBuilder().build(); 
     } catch (HibernateException e) { 
      //in case the SessionFactory cannot be built, then the stackTrace is displayed 
      e.printStackTrace();   
     } 
    } 

    //method that returns the Hibernate session factory 
    public static SessionFactory getSessionFactory(){ 
     return sessionFactory; 
    } 
} 

Вопрос у меня есть, - как я могу избежать EntityManagerFactory is closed ошибка. Кроме того, мне придется получать этот список снова и снова, в режиме реального времени. Это возможно с Hibernate? Получить список элементов из базы данных в режиме реального времени (скажем, каждые 2 секунды или около того)? Я знаю, что это зависит от количества элементов и т. Д., Но я спрашиваю с технической точки зрения - из того, что я понимаю, открытие и закрытие сеанса занимает много времени - я мог бы делать это снова и снова на той же сессии и если да, то как?

Спасибо!

ответ

3

Я бы сказал, что вы слишком много делаете.

Вам необходимо выполнить флеш/зафиксировать транзакцию и закрыть сеанс, используя метод openSession() фабрики.

Но я не думаю, что вам нужно, чтобы закрыть самого SessionFactory

//close the SessionFactory 
HibernateUtilities.getSessionFactory().close(); 

удалить эту линию, и вы можете бы быть в состоянии использовать завод много раз.

+0

Кажется, вы абсолютно правы. Интересно то, что я пробовал это в прошлом, и это не сработало. Возможно, я также удалил (закомментировал) строку 'session.close();' code. Я довольно полный новичок в Hibernate и не знаю точно, что все это делает, единственное, что я могу сделать, это «угадать» или искать в учебниках то, что именно они делают. В любом случае, похоже, что это работает! Большое спасибо! –

+0

Кстати, есть ли «опасность» оставить SessionFactory открытым? Должен ли я об этом беспокоиться? –

+1

Во всех приложениях, с которыми я работал, SessionFActory был создан один раз во время запуска и был уничтожен только тогда, когда приложение было закрыто. Создание Factory - очень интенсивный процесс, и как только он был создан, я оставил бы его в одиночестве. Вы должны закрывать свои сеансы, поскольку они являются работоспособными, но фабрика является апатридом, поэтому ее не нужно воссоздавать по запросу. –

 Смежные вопросы

  • Нет связанных вопросов^_^