2017-02-06 4 views
2

Ich habe vor kurzem einen Webdienst erstellt, der eine statische Methode in Java verwendet, um eine Liste von Elementen aus der Datenbank zu erhalten.EntityManagerFactory ist geschlossen, Hibernate

Der Webservice funktioniert einwandfrei und gibt JSON zurück an den Aufrufer. Es funktioniert jedoch nur einmal. Wenn Sie versuchen, zu aktualisieren oder eine neue Anforderung zu erstellen, erhalte ich einen EntityManagerFactory is closed Fehler.

Hier ist, wie die Web-Service-Klasse wie folgt aussieht:

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); 
    } 
} 

Wie Sie sehen können, ist die Liste der Fahrzeuge bevölkert wird, um die ExecuteVehicle.getVehicleList() Methode.

Hier ist, wie das Verfahren wie folgt aussieht:

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; 

    } 

Hier die HibernateUtilities Klasse ist, die Pflege der Session dauert und so weiter:

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; 
    } 
} 

Die Frage, die ich habe, ist - wie kann ich das vermeiden EntityManagerFactory is closed Fehler. Darüber hinaus muss ich diese Liste immer wieder in Echtzeit abrufen. Ist das mit Hibernate machbar? Um eine Liste von Elementen aus einer Datenbank in Echtzeit zu erhalten (etwa alle 2 Sekunden)? Ich weiß, das hängt von der Anzahl der Dinge ab und so weiter, aber ich frage von einem technischen Standpunkt aus - von dem, was ich verstehe, dauert das Öffnen und Schließen der Sitzung eine lange Zeit - könnte ich dies immer wieder in derselben Sitzung tun und wenn ja, wie?

Danke!

Antwort

3

Ich würde sagen, dass Sie dort zu viel tun.

Sie müssen die Transaktion spülen/festschreiben und die Sitzung schließen, wenn Sie die Methode openSession() des Werks verwenden.

Aber ich glaube nicht, müssen Sie die Session selbst

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

Entfernen Sie diese Zeile schließen und Sie können die Fabrik oft verwenden würde.

+0

Es scheint, Sie haben absolut Recht. Das Interessante ist, dass ich das in der Vergangenheit versucht habe und es nicht funktioniert hat. Es besteht die Möglichkeit, dass ich die Codezeile 'session.close();' entfernt (auskommentiert) habe. Ich bin so ziemlich ein vollständiger Anfänger in Hibernate und weiß nicht genau, was all diese Dinge tun, das einzige, was ich tun kann, ist zu "raten" oder in Tutorials zu suchen, was genau sie tun. Wie auch immer, es scheint jetzt zu funktionieren! Danke vielmals! –

+0

Gibt es übrigens eine "Gefahr", die SessionFactory offen zu lassen? Sollte ich mir darüber Gedanken machen? –

+1

In all der Anwendung, mit der ich gearbeitet habe, wurde der SessionFactory einmal während des Startup erstellt und wurde nur zerstört, wenn die Anwendung geschlossen wurde. Das Erstellen der Factory ist ein sehr intensiver Prozess und sobald er erstellt wurde, würde ich ihn verlassen allein. Sie müssen Ihre Sitzungen schließen, da sie zustandsbehaftet sind. Die Factory ist jedoch zustandslos, sodass sie nicht pro Anforderung neu erstellt werden muss. –

Verwandte Themen