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!
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! –
Gibt es übrigens eine "Gefahr", die SessionFactory offen zu lassen? Sollte ich mir darüber Gedanken machen? –
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. –