Ich habe eine Anwendung, die Hibernate verwendet. Die Leistung ist sehr schlecht. Wenn ich nur ein einfaches Feld ändere, werden viele viele Objekte aktualisiert, nachdem session.flush() aufgerufen wurde.Hibernate session.flush() -> Wie nur schmutzige Objekte anstelle von allem zu aktualisieren?
Ich werde Ihnen einige Code-Schnipsel und Protokolldateien zeigen, vielleicht können Sie die Probleme erkennen. Ich bin kein Hibernate-Experte. Ich hoffe, dass das genug Informationen sind, um mir ein paar Tipps zu geben? Wahrscheinlich habe ich mit einem Buch gelernt, um es selbst zu lösen ...
Ich denke, das Problem ist, dass es keine Lazy Loading oder dass es ein falsches CASCADING gibt? Die meisten hbm.xml-Dateien haben "lazy = false". session.clear() wird nach dem Leeren nicht aufgerufen. Aber: Wenn ich auch session.clear() verwende, dann funktioniert die erste Änderung und wird beibehalten, aber alle folgenden Änderungen werden nicht beibehalten.
Hier ein paar Schnipsel. Ich denke, das sollten alle wichtigen Schnipsel sein? Wenn du mehr Informationen brauchst, sag es mir. Vielen Dank. Mit freundlichen Grüßen, Kai Wähner
Eine Zuordnungsdatei:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="de.bea.plato.domain.Auftrag" table="AUFTRAG" lazy="false">
<id column="OID" name="oid" length="25" type="java.lang.String" unsaved-value="null">
<generator class="de.bea.plato.datastore.PlatoIdGenerator"/>
</id>
<many-to-one name="projekt" column="ProjektOID"/>
<many-to-one name="mitarbeiterLetzteAenderung" column="MitarbeiterOID"/>
<property name="day" type="de.bea.plato.hibernate.TypeDay"/>
<property name="dayLetzteAenderung" type="de.bea.plato.hibernate.TypeDay"/>
<!-- fields of type String must not be set to "" -->
<property name="bezeichnung" length="80" access="field"/>
<property name="auftragsNummer" length="40" access="field"/>
<property name="bestellNummer" length="40" access="field"/>
<!-- fields of type String must not be set to "" -->
<property name="bemerkung" length="1024" access="field"/>
<property name="abrechenbarVon" type="de.bea.plato.hibernate.TypeDay"/>
<property name="abrechenbarBis" type="de.bea.plato.hibernate.TypeDay"/>
<property name="status" not-null="true"/>
<many-to-one name="budget" column="BudgetOID"/>
<property name="rechnungsempfaenger" length="255" access="field"/>
<property name="zahlungsziel" length="1024" access="field"/>
<many-to-one name="anschrift" column="AnschriftOID"/>
<property name="projektFestPreis" not-null="true"/>
</class>
</hibernate-mapping>
Die Konfiguration:
configuration = new Configuration();
try {
configuration.addClass(Waehrung.class);
configuration.addClass(BK.class);
configuration.addClass(BetriebskalenderAusnahme.class);
configuration.addClass(Mitarbeiter.class);
configuration.addClass(TeilProjekt.class);
configuration.addClass(Projekt.class);
configuration.addClass(ProjektGruppe.class);
configuration.addClass(StundenEntry.class);
Properties properties = databaseInit.getHibernateProperties();
configuration.setProperties(properties);
Das Verfahren, das von dem Swing-GUI aufgerufen wird, nachdem ein Feld geändert wird:
public void flush() throws PlatoDatastoreException {
synchronized (syncObject) {
if (session != null) {
try {
session.flush();
session.connection().commit();
// session.clear();
updateLastUse();
log.info("Session flushed and connection committed.");
}
catch (Exception e) {
log.error("Error while flushing session", e);
throw new PlatoDatastoreException(e);
}
}
else {
log.info("Flush without an active session");
}
}
}
Hibernate Eigenschaften:
name = companies/XYZ/hibernate_releaseTest2
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.pool_size= 10
# test system ----------------------------
hibernate.connection.url=jdbc:oracle:thin:@xyz:1521:abc
hibernate.connection.username=x
hibernate.connection.password=y
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.query.substitutions= true 1, false 0, yes 'Y', no 'N'
hibernate.statement_cache.size= 100
hibernate.jdbc.fetch_size=1000
hibernate.c3p0.max_size=10
hibernate.c3p0.min_size=0
hibernate.c3p0.max_statements=0
hibernate.c3p0.timeout=60
hibernate.c3p0.valdiate=false
Log-Datei nach einer Änderung zu einem Feld (wie Sie viele viele viele Dinge passieren, aber nur ein Feld aktualisiert und sollen beibehalten werden sehen):
31197 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - flushing session
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - processing flush-time cascades
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - processing cascade ACTION_SAVE_UPDATE for: de.bea.plato.domain.Mitarbeiter
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.mitarbeiterZeit
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.mitarbeiterZeit
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.workingList
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#ericjxxxxxxxtw8468gf00000]
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31198 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#normanzxxxxxfveje5pd00000]
31198 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#normanzxxxxxysjbzgpe00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#ericjxxxxxxx7ch468gf00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#normanzxxxxx4mpke5pd00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#normanzxxxxxhv7me5pd00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#dominiknxxxxdyi3mkmf00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#ericjxxxxxxxtnzjf5ff00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascading to saveOrUpdate: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractSaveEventListener - persistent instance of: de.bea.plato.domain.TeilProjekt
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - ignoring persistent instance
31199 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.DefaultSaveOrUpdateEventListener - object already associated with session: [de.bea.plato.domain.TeilProjekt#normanzxxxxxu40pe5pd00000]
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.workingList
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done processing cascade ACTION_SAVE_UPDATE for: de.bea.plato.domain.Mitarbeiter
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - processing cascade ACTION_SAVE_UPDATE for: de.bea.plato.domain.Mitarbeiter
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.mitarbeiterZeit
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.mitarbeiterZeit
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.workingList
31199 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.workingList
31200 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done processing cascade ACTION_SAVE_UPDATE for: de.bea.plato.domain.Mitarbeiter
31200 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - processing cascade ACTION_SAVE_UPDATE for: de.bea.plato.domain.Mitarbeiter
31200 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.mitarbeiterZeit
31200 [Gui4j-Worker 0] DEBUG org.hibernate.engine.Cascades - done cascade ACTION_SAVE_UPDATE for collection: de.bea.plato.domain.Mitarbeiter.mitarbeiterZeit
... a lot more of this ...
31467 [Gui4j-Worker 0] DEBUG org.hibernate.type.StringType - binding null to parameter: 5
31467 [Gui4j-Worker 0] DEBUG org.hibernate.type.BooleanType - binding 'false' to parameter: 6
31467 [Gui4j-Worker 0] DEBUG org.hibernate.type.DoubleType - binding '5.0' to parameter: 7
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.DateType - binding '22 Dezember 2010' to parameter: 8
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.CharacterType - binding null to parameter: 9
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.StringType - binding null to parameter: 10
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.DoubleType - binding '0.0' to parameter: 11
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.DoubleType - binding '0.0' to parameter: 12
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.DoubleType - binding '0.0' to parameter: 13
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.StringType - binding 'userxxxxxxxxewshlhnd00300' to parameter: 14
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.StringType - binding 'userxxxxxxxxixshlhnd00500' to parameter: 15
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.StringType - binding 'eur' to parameter: 16
31468 [Gui4j-Worker 0] DEBUG org.hibernate.type.StringType - binding 'userxxxxxxxx49zr90ig00000' to parameter: 17
31468 [Gui4j-Worker 0] DEBUG org.hibernate.jdbc.AbstractBatcher - Adding to batch
31469 [Gui4j-Worker 0] DEBUG org.hibernate.jdbc.AbstractBatcher - Executing batch size: 1
31521 [Gui4j-Worker 0] DEBUG org.hibernate.jdbc.AbstractBatcher - success of batch update unknown: 0
31521 [Gui4j-Worker 0] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
31521 [Gui4j-Worker 0] DEBUG org.hibernate.jdbc.AbstractBatcher - closing statement
31522 [Gui4j-Worker 0] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - post flush
31532 [Gui4j-Worker 0] INFO de.bea.plato.datastore.PlatoDatastore - Session flushed and connection committed.
Danke Natürlich habe ich den ganzen Code viel mehr von mir selbst zu analysieren haben einen Gedanken..: Ich denke, ich sollte mehr Sitzungen verwenden? In "Hibernate in Action" habe ich gelesen, dass SessionFactory teuer ist, aber dass Sie viele Sitzungen verwenden können. In diesen Anwendungen ist der Persistenz-Kontext sehr groß, denke ich ... Und ich habe Recht: Weitere Änderungen nach dem ersten werden nicht beibehalten (wenn ich session.clear verwende), weil sich wahrscheinlich dann alle Objekte im gelösten Zustand befinden - wahrscheinlich nirgendwo im Code werden die Objekte wieder angefügt/zusammengeführt und somit nach der zweiten Änderung nicht persistent? –
@Kai: Eigentlich bin ich mir nicht sicher über das richtige Design der Swing-Anwendung mit Hibernate Vielleicht müssen Sie das Objekt nach dem Laden trennen und das geänderte Objekt zusammenführen, wenn Sie es speichern. Und ja, Objekte sind nach 'session.clear()' im losgelösten Zustand. – axtavt