2016-04-08 5 views
0

Ich habe vor kurzem festgestellt, dass eine Anwendung mehr Speicher verbraucht als es sollte. Ich machte einen Thread-Dump der JVM und stellte fest, dass es Hunderte von Megabyte SQL-Abfragen in Hibernate SessionFactoryImpl gab.JPA/Ruhezustand eine Menge von Abfragen im Speicher beim Start der Anwendung

Diese Abfragen treten im Speicher auf, wenn der Anwendungsserver gestartet wird. Ich habe bereits die Hypothese einer Warteschlange (JMS) oder eines anderen Prozesses im Hintergrund verworfen.

Die Abfragen sind in diesem 2-Formate:

select 
diferenc0_.id as id975_137_, 
[...] 
where diferenc0_.id=? 

Oder

select 
diferenc0_.id as id975_137_, 
[...] 
where diferenc0_.id= IN (?,?,?,?,?,?,?,?) -- because default_batch_fetch_size = 8 

Meine persistence.xml Konfigurationen (I hbm2ddl ausgeschaltet):

"hibernate.hbm2ddl.auto", "" 
"hibernate.query.startup_check", "false" 
"hibernate.show_sql", "false" 
"hibernate.format_sql", "false" 
"hibernate.transaction.auto_close_session", "true" 
"hibernate.cache.use_second_level_cache", "false" 
"hibernate.cache.use_query_cache", "false" 
"hibernate.jdbc.batch_size", "20" 
"hibernate.default_batch_fetch_size", "8" 

Ich verwende Ruhezustand 3.3.0.

Ein weiteres wichtiges Detail: Diese Abfragen werden nicht an die Datenbank gesendet! Ich analysierte mit dem DBA unseres Teams die Abfrage, die an die Datenbank gesendet wird, wenn der Jboss startet. Wir verwenden auch nicht benannten Abfragen im System.

Wie eine Anwendung ein wenig alt ist, verwendeten die alten Entwickler die EAGER-Ressource im Mapping abrufen. Diese generierten Abfragen sind also wirklich riesig.

Frage: Zu welchem ​​Zweck erstellt Hibernate diese Abfragen im Speicher, wenn die Anwendung gestartet wird?

+0

Hibernate für die Herstellung von extra/nutzlose Abfrage (expecially mit EAGER fetching) berühmt ist, aber zumindest es startet sie durch eine Anwendungseingabe, nicht von ihm selbst. Sind Sie sicher, dass Ihre Anwendung keinen Timer, geplanten Job oder etwas enthält, das eine Abfrage über Hibernate beim Start und/oder nach einer bestimmten Zeit startet? –

+0

Hallo! Ich bin sicher. Wie gesagt, diese Abfragen werden nicht einmal an die Datenbank gesendet. Dies scheint etwas zu sein, das 'hibernate.query.startup_check' kann, aber ich habe diese Option bereits auf false gesetzt. – Dherik

+0

Konnten Sie Ihre Ruhe-/Persistenzkonfigurationsdatei posten? –

Antwort

0

können Sie versuchen, diese Eigenschaft hinzufügen:

"hibernate.temp.use_jdbc_metadata_defaults","false" 

Und entfernen

"hibernate.hbm2ddl.auto", "" 
+0

Ich werde in der nächsten Montag testen :). – Dherik

+0

Nicht funktionieren :(. Aber es ist ein guter Tipp. – Dherik

Verwandte Themen