Hi,
ich habe hier ein Serverprojekt im WLP. Leider habe ich von Anfang an kein Hibernate richtig zum Laufen bekommen, weil die Config-Files im WLP scheinbar o anders hin müssen, als in allen anderen Servern. Jetzt haben wir aber wenigsten JPA am laufen. Ich bin mir aber bei der Stabilität, bzw. bei der Nutzung der Verbindungen nicht 100% sicher, ob ich da alles richtig mache, weil ich scheinbar ständig die Verbindungen offen lasse.
Deswegen brauche ich mal Experten-Rat:
Ich habe eine Klasse
Wenn ich jetzt auf die Datenbank zugreifen will, dann sah das ungefähr so aus:
Ich hab aber festgestellt, dass ich dann ein Problem bekomme, wenn ich auf einen gerade angelegten Satz direkt wieder zugreifen möchte. Also sieht eine neue Funktion jetzt so aus:
Wenn ich den emf hier schließe, bekomme ich die Meldung, dass noch weitere X Verbindungen offen sind. wenn wir viel in einer Schleife schreiben wollten, dann sind wir auch oft an zu vielen offenen Verbindungen gescheitert, das habe ich dann als eigene Schleife in der Funktion erledigt, dann ging das auch.
Jetzt möchte ich nicht immer einen emf und em öffnen und am Ende wieder beides schließen, sondern hätte das gerne generell gebaut.
Habe ich hier schon den Ansatz verbockt, oder habe ich einfach irgendwo einen Denkfehler gehabt?
Danke für eure Hilfe.
ich habe hier ein Serverprojekt im WLP. Leider habe ich von Anfang an kein Hibernate richtig zum Laufen bekommen, weil die Config-Files im WLP scheinbar o anders hin müssen, als in allen anderen Servern. Jetzt haben wir aber wenigsten JPA am laufen. Ich bin mir aber bei der Stabilität, bzw. bei der Nutzung der Verbindungen nicht 100% sicher, ob ich da alles richtig mache, weil ich scheinbar ständig die Verbindungen offen lasse.
Deswegen brauche ich mal Experten-Rat:
Ich habe eine Klasse
Java:
@Singleton
public class JPAUtilities {
private static EntityManagerFactory entityManagerFactory = null;
public static EntityManagerFactory getEntityManagerFactory() {
if(entityManagerFactory == null || !entityManagerFactory.isOpen()) {
Map<String, Object> config = new HashMap<>();
config.put("javax.persistence.jdbc.url", AtcConfiguration.dbParameter.getConnectionString());
config.put("javax.persistence.jdbc.user", AtcConfiguration.dbParameter.getUSER());
config.put("javax.persistence.jdbc.password", AtcConfiguration.dbParameter.getPASSWORD());
config.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
entityManagerFactory = Persistence.createEntityManagerFactory("oracle_con", config);
}
return entityManagerFactory;
}
}
Wenn ich jetzt auf die Datenbank zugreifen will, dann sah das ungefähr so aus:
Java:
public static List<Abfrage> loadAllAbfragen() {
EntityManagerFactory emf = JPAUtilities.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
TypedQuery<Abfrage> query = em.createQuery(StaticJPQL.ALLABFRAGEN, Abfrage.class);
List<Abfrage> resultList = query.getResultList();
em.close();
return resultList;
}
Ich hab aber festgestellt, dass ich dann ein Problem bekomme, wenn ich auf einen gerade angelegten Satz direkt wieder zugreifen möchte. Also sieht eine neue Funktion jetzt so aus:
Java:
public static void setRunning(Abfrage a, boolean running) {
EntityManagerFactory emf = JPAUtilities.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LastRun orgRun = em.find(LastRun.class, a.getPk());
orgRun.setRunning(running);
em.merge(orgRun);
em.getTransaction().commit();
em.close();
emf.close();
}
Wenn ich den emf hier schließe, bekomme ich die Meldung, dass noch weitere X Verbindungen offen sind. wenn wir viel in einer Schleife schreiben wollten, dann sind wir auch oft an zu vielen offenen Verbindungen gescheitert, das habe ich dann als eigene Schleife in der Funktion erledigt, dann ging das auch.
Jetzt möchte ich nicht immer einen emf und em öffnen und am Ende wieder beides schließen, sondern hätte das gerne generell gebaut.
Habe ich hier schon den Ansatz verbockt, oder habe ich einfach irgendwo einen Denkfehler gehabt?
Danke für eure Hilfe.