Hibernate - Transaction

Status
Nicht offen für weitere Antworten.

y0dA

Top Contributor
Hi!
Wie handhabt ihr eigentlich die Hibernate Transaction? Angenommen ich habe eine Methode in welcher über eine Liste iteriert wird und für jeden Eintrag in der Liste muss man bspw. 1-4 Statements absetzen, macht ihr das alles innerhalb einer Transaction oder macht ihr jeweils eine neue auf? Weiters setzt ihr die Transactions in der "DAO Klasse" oder macht ihr das auch im Model oder in der View?
 

ms

Top Contributor
y0dA hat gesagt.:
Hi!
Wie handhabt ihr eigentlich die Hibernate Transaction? Angenommen ich habe eine Methode in welcher über eine Liste iteriert wird und für jeden Eintrag in der Liste muss man bspw. 1-4 Statements absetzen, macht ihr das alles innerhalb einer Transaction oder macht ihr jeweils eine neue auf?
Das ist eine Frage der Anforderung. Hat mit Hibernate nichts zu tun. Wenn es keine Anforderung gibt, dann würde ich den Transaktionskontext so klein wie möglich machen, also pro Methode bzw. den Treiber auf autocommit schalten, weil eine Transaktion Speicher für das Rollback benötigt.

y0dA hat gesagt.:
Weiters setzt ihr die Transactions in der "DAO Klasse" oder macht ihr das auch im Model oder in der View?
Wenn, dann im Controller bzw. dort, wo die Businesslogik implementiert ist, zb EJBs.
Im DAO ist es eher schlecht weil dann zwei DAO-Methoden nicht innerhalb einer Transaktion laufen können. Ausser du rufst innerhalb einer DAO-Methode eine weitere DAO-Methode auf.
Dann hast du aber die Businesslogik im DAO => :autsch: autsch!

Ich bevorzuge Spring um den Transaktionskontext für Servicebeans zu definieren.

ms
 

y0dA

Top Contributor
Hi danke für die Infos.
Betreffend Spring - soweit bin ich leider noch nicht!

Also habe ich bisher einen sehr großen Fehler gemacht und die Transaktionen in der Dao geöffnet und geschlossen :( .

D.h. du machst folgendes in der Businesslogik:
Code:
Session session = HibernateUtil.getCurrentSession();
tx = session.beginTransaction();

Und übergibst dann der DAO die Session oder wie darf ich das verstehen?
Oder wird das HibernateSessionHandling auch in der Businesslogik durchgeführt?

Bsp, eine bisherige DAO von mir:
Code:
public static ArrayList<E30151Model> readAllData() {
		StringBuffer sb = new StringBuffer();
		sb.append(" FROM ");
		sb.append(E30151DB.TABLE_NAME);
		sb.append(" ORDER BY sequence, description");

		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		ArrayList<E30151Model> value = new ArrayList<E30151Model>();

		try {
			tx = session.beginTransaction();
			
			/* load data */
			value = (ArrayList<E30151Model>) session.createQuery(sb.toString()).list();

			/* commit and close session */
			tx.commit();	
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
		} finally {
			session = null;
			tx = null;
		}
		return value;
	}
 
G

Guest

Gast
Wie wär's mit einer Art PersistenceContext. Es kapselt das ganze Session- und Transaktionshandling.
Jedes Dao erbt von einem abstrakten Dao und kriegt PersistenceContext als ersten Parameter an den
Konstruktor.
Code:
PersistenceContext ctx = null;
try
{
   ctx = PersistenceContext.create(); // Session und Transaktion starten
   WasAuchImmerDao dao = DaoFactory.create(ctx, WasAuchImmerDao.class);
   WasAuchImmerDao2 dao2 = DaoFactory.create(ctx, WasAuchImmerDao2.class);
   dao...
   dao2...
}
catch(DaoException e)
{
   if(null != ctx)
   {
      ctx.setRollbackOnly(); // Rollback beim Schliessen
   }
   ... // sonstige Fehlerbehandlung
}
finally
{
   if(null != ctx)
   {
      ctx.close(); // commit oder rollback, wenn setRollbackOnly() aufgerufen 
   }
}
oder gleich JPA verwenden und den App-Server das ganze verwalten lassen.
 

ms

Top Contributor
Ich würde das jetzt nicht als großen Fehler bezeichnen, so wie du es gepostet hast, da es in diesem Fall nur eine einzige Datenbankoperation ist, und zwar eine lesende. Eine Transaktion macht nur dann Sinn wenn mehrere schreibende Datenbankoperationen durchgeführt werden sollen und diese eine gewisse Abhängigkeit untereinander haben. In deinem Fall ist es nur unnötig.

Hier ist übrigens was passendes zum Thema.

ms
 

y0dA

Top Contributor
Also brauche ich nun keine Transaktion wenn ich aus der DB etwas lese? Geht aber nur mit HQL oder? Und wenn ich Proceduren der DB aufrufe ist das dann lesend oder scheibend?
 

ms

Top Contributor
y0dA hat gesagt.:
Also brauche ich nun keine Transaktion wenn ich aus der DB etwas lese? Geht aber nur mit HQL oder? Und wenn ich Proceduren der DB aufrufe ist das dann lesend oder scheibend?
1) Nein, sollte immer gehen.
2) Ein SELECT ist immer lesend, INSERT, UPDATE und DELETE schreibend. Selbsterklärend, oder? Für Stored Procedures gilt, soweit ich das verstanden habe mit Einschränkungen dasselbe. Siehe hier: http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#sp_query

ms
 

y0dA

Top Contributor
Danke für die Erklärungen (und was schreibend und was lesend ist hatte ich schon zuvor begriffen^^).

Also sollte ich eher auf Transaktionen verzichten, wenn ich nur ein Stmt gegen die DB absetze?
 

SnooP

Top Contributor
Ich würde hier "Business"-Transaktionen und das Hibernate-Transaction-Objekt unterscheiden... letzteres gehört in das DAO und kapselt schreibende Operationen in einer Klammer, die dann in DB-Transaktionen mündet... letzten Endes hab ich in meinen DAOs eigentlich immer nur eine Operation gleichzeitig verpackt und mache für mehrere Operationen hintereinander halt immer wieder ne Transaction auf.

Für tatsächliches Transaction-Handling empfiehlt sich imho Spring - da kannst du dann z.B. via Annotations oder nameConventions bestimmte Methoden unter Transaktionsverwaltung stellen - das ist imho sauberer noch als diese blöden Transaktionsklammern rumhängen zu haben - die ja nicht wirklich was mit der business-logik aber auch nich wirklich was mit der dao-logik zu tun haben.

wenn du nur ein Select machst, brauchst du keine Transaction, da kann ja auch kein rollback passieren ;) ... ansonsten ist die Operation aber genauso wie das Erstellen der Session nicht teuer.
 

ms

Top Contributor
y0dA hat gesagt.:
Danke für die Erklärungen (und was schreibend und was lesend ist hatte ich schon zuvor begriffen^^).
Ich meinte damit, dass es eben darauf ankommt, was in der Stored Procedure passiert.

y0dA hat gesagt.:
Also sollte ich eher auf Transaktionen verzichten, wenn ich nur ein Stmt gegen die DB absetze?
Ich geh mal davon aus, dass du jetzt ein schreibendes Statement meinst. Zum schreiben brauchst du immer eine Transaktion (Wir reden von richtigen Datenbanken, nicht MySQL/MyIsam). Entweder im einfachsten Fall so wie du es geschrieben hast, oder autocommit = true setzen (dann ersparst du dir jedesmal den Code für die Transaktionen) oder an die Session koppeln oder mit Spring, ... es gibt einige Wege.
Wir sollten ein konkretes Beispiel hernehmen, dann wirds vielleicht verständlicher.

@SnooP
Was genau verstehst du unter Business-Transaktionen?
Wenn ich innerhalb einer Transaktion in die Datenbank schreibe und danach in der Businesslogik eine Exception auftritt sollte auch in der Datenbank ein Rollback stattfinden. Daher halte ich eine Trennung in diesem Fall für nicht sinnvoll.

ms
 

y0dA

Top Contributor
SnooP hat gesagt.:
letzten Endes hab ich in meinen DAOs eigentlich immer nur eine Operation gleichzeitig verpackt und mache für mehrere Operationen hintereinander halt immer wieder ne Transaction auf.

Also bin ich doch nicht allein mit dieser Umsetzung :)

Denke ich habs nun geschnallt und werde mal die Transaktionen bei Lesezugriffe entfernen. Spring muss ich mich leider erst einlesen, wie ich das mit Hibernate koppeln kann.


**EDIT**
ms hat gesagt.:
y0dA hat gesagt.:
Danke für die Erklärungen (und was schreibend und was lesend ist hatte ich schon zuvor begriffen^^).
Ich meinte damit, dass es eben darauf ankommt, was in der Stored Procedure passiert.

y0dA hat gesagt.:
Also sollte ich eher auf Transaktionen verzichten, wenn ich nur ein Stmt gegen die DB absetze?
Ich geh mal davon aus, dass du jetzt ein schreibendes Statement meinst. Zum schreiben brauchst du immer eine Transaktion (Wir reden von richtigen Datenbanken, nicht MySQL/MyIsam). Entweder im einfachsten Fall so wie du es geschrieben hast, oder autocommit = true setzen (dann ersparst du dir jedesmal den Code für die Transaktionen) oder an die Session koppeln oder mit Spring, ... es gibt einige Wege.
Wir sollten ein konkretes Beispiel hernehmen, dann wirds vielleicht verständlicher.

@SnooP
Was genau verstehst du unter Business-Transaktionen?
Wenn ich innerhalb einer Transaktion in die Datenbank schreibe und danach in der Businesslogik eine Exception auftritt sollte auch in der Datenbank ein Rollback stattfinden. Daher halte ich eine Trennung in diesem Fall für nicht sinnvoll.

ms

Nun bin ich wieder ein wenig verwirrt, wenn ich autocommit = true setze brauche ich kein Transactionshandling mehr - hat das auch Nachteile, dürfte wohl langsamer sein als wenn ich Transactions benutze?

Es wurde der Ruf nach einem Bsp laut, hier nun mein aktueller Problemcode, in welchem über eine Liste iteriert wird und pro Listeneintrag werden min. 2 DB Statements abgesetzt. Hierbei wird pro Stmt eine eigene Transaction erstellt - wie könnte ich jenes verbessern (die StringBuffer-Lösung zum zusammensetzen des Stmts ist auch eine Notlösung..):

Businesslogik:
Code:
public void evaluateTrackSegmentList(final List<TrackSegment> list) {
		/* object for doing a statistic of the whole track */
		FeatureStatisticController statistic = new FeatureStatisticController();

		for (TrackSegment trackSegment : list) {
			/* match start point and create feature segment */
			List<FeatureSegment> startMatch =
				this.createFeatureSegment(this.doMatchPoint(trackSegment.getJGeom().getJGeometry().getFirstPoint(),
						trackSegment.getJGeom().getJGeometry().getSRID()));
			/* match end point and create feature segment */
			List<FeatureSegment> endMatch =
				this.createFeatureSegment(this.doMatchPoint(trackSegment.getJGeom().getJGeometry().getLastPoint(),
						trackSegment.getJGeom().getJGeometry().getSRID()));
        }
}


private List<FeatureModel> doMatchPoint(final double[] point, final int srid) {
		/* first match - start point */
		return FeatureDB.getNearestNeighbour4Point(point, 10, GeomOperationDB.UNIT_METER,
				FeatureController.FEATURE_TYPE_STREET, FeatureController.WITHIN_DISTANCE, srid);
	}


	private List<FeatureSegment> createFeatureSegment(final List<FeatureModel> list) {
		List<FeatureSegment> l = new LinkedList<FeatureSegment>();
		for (FeatureModel model : list) {
			/* add new feature segment - constructor also calculate distance */
			l.add(new FeatureSegment(model.getId(), model.getGeom(),  NMEAController.UNIT_METER));
		}
		return l;
	}

Persistenzklasse:
Code:
public static List<FeatureModel> getNearestNeighbour4Point(final double[] point, final int nnNumRes,
			final String unit, final int featureType, final int withinDistance, final int srid) {	
		StringBuffer point2 = new StringBuffer();
		point2.append(" SDO_GEOMETRY( ");
		point2.append(FeatureDB.POINT_GTYPE);
		point2.append(", ");
		point2.append(srid);
		point2.append(", ");
		point2.append("SDO_POINT_TYPE( ");
		point2.append(point[0]);
		point2.append(", ");
		point2.append(point[1]);
		point2.append(", null), null, null)");		
		
		StringBuffer sb = new StringBuffer();
		sb.append(" SELECT {feature.*} ");
		sb.append(" FROM feature {feature} ");
		sb.append(" WHERE SDO_NN ( ");
		sb.append(" feature.f_geom, ");
		sb.append(point2.toString());
		sb.append(", '");
		sb.append(" SDO_NUM_RES = ");
		sb.append(nnNumRes);
		sb.append(" ");
		sb.append(unit);
		sb.append("', 1) = 'TRUE' AND SDO_WITHIN_DISTANCE( feature.f_geom, ");
		sb.append(point2.toString());
		sb.append(", ' DISTANCE = ");
		sb.append(withinDistance);
		sb.append(" ");
		sb.append(unit);
		sb.append("') = 'TRUE' AND f_ft_id = ");
		sb.append(featureType);

		Session session = HibernateUtil.getCurrentSession();
		Transaction tx = null;
		List<FeatureModel> list = null;	
		
		try {
			tx = session.beginTransaction();	
			SQLQuery q = session.createSQLQuery(sb.toString());
			q.addEntity("feature", FeatureModel.class);
			
			list = q.list();

			/* commit and close session */
			tx.commit();	
		} catch (Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		} finally {
			session = null;
			tx = null;
		}
		return list;
	}
 

SnooP

Top Contributor
ich meinte mit Business-Transaktionen halt Transaktionen die noch etwas schlauer sind als die Hibernate-Transaktionen wie etwa per JTA... mit Spring wird dann darüber natürlich auch ein DB-seitiger rollback durchgeführt - aber via Spring kann man halt die Transaktionen so wie man es gerne möchte, nämlich quasi deskriptiv an die zuständigen zu überwachenden Methoden dranpappen.

Spring und Hibernate verhalten sich ganz wunderbar miteinander ;) ... das Stichwort heißt dort HibernateTemplate und bietet unheimlich viel Abstraktion... sprich jedes DAO bekommt ein Template injiziert auf das dann zugegriffen wird.. die DAOs wiederum können in den zuständigen Controller injiziert werden und feddich is ;) ... alles hübsch konfigurativ via xml-datei ohne dabei aber großartig die Semantik beim Coden verlieren zu müssen, weil die entsprechenden getter/felder sind ja da - nur spar ich mir dann die null-pointer exceptions weil ich mal wieder vergessen hab irgendwo nen DAO durchzureichen oder ähnliches gemisste ;)
 

ms

Top Contributor
y0dA hat gesagt.:
SnooP hat gesagt.:
letzten Endes hab ich in meinen DAOs eigentlich immer nur eine Operation gleichzeitig verpackt und mache für mehrere Operationen hintereinander halt immer wieder ne Transaction auf.

Also bin ich doch nicht allein mit dieser Umsetzung :)
Da kannst du gleich autocommit auf true setzen, dann ersparst du dir die Schreiberei.
Jedoch hast du dann keine Transaktion im fachlichen Sinn.

Zu deinem Nachtrag:
Du iterierst über die Liste und setzt pro Listeneintrag 2 Statements (insert, update oder delete) ab.
Jetzt stellt sich die Frage was passieren soll, wenn was schief geht.

1) Wenn sichergestellt werden soll, dass pro Listeneintrag entweder beide Statements oder gar keines ausgeführt werden soll, dann muss eine Transaktionsklammer über die beiden Statements vorhanden sein.
Dh, geht das erste Statement OK, das zweite Statement aber schief, soll auch das erste nicht commited werden. Die beiden Statements für alle anderen Listeneinträge werden unabhängig davon bearbeitet.

2) Wenn sichergestellt werden soll, dass entweder alle Statements für alle Listeneinträge ausgeführt werden sollen oder gar keines, dann muss eine Transaktionsklammer über die Abarbeitung der ganzen Liste vorhanden sein.
Dh, gehen die beiden Statements des Listeneintrags 1..n OK, aber zB das zweite Statement des letzten Listeneintrags aber schief, sollen auch alle anderen Statements nicht commited werden.

Konkret sieht der Unterschied in etwa so aus:

Fall 1:
Code:
for (Iterator<Listeneintrag> it = liste.iterator(); it.hasNext(); ) {
    try {
        tx = session.beginTransaction();
        dbMethode1();
        dbMethode2();
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
    }
}

Fall 2:
Code:
try {
    tx = session.beginTransaction();
    for (Iterator<Listeneintrag> it = liste.iterator(); it.hasNext(); ) {
        dbMethode1();
        dbMethode2();
    }
    tx.commit();
} catch (Exception e) {
    tx.rollback();
}

Das was du aber machst ist:

Fall 2:
Code:
for (Iterator<Listeneintrag> it = liste.iterator(); it.hasNext(); ) {
    try {
        tx = session.beginTransaction();
        dbMethode1();
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
    }
    try {
        tx = session.beginTransaction();
        dbMethode2();
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
    }
}
Jede dbMethode wird unabhängig von der anderen ausgeführt. Es spricht nichts dagegen, solange fachlich nichts anderes gefordert wird.

Zur StringBuffer-Notlösung.
1) Zur besseren Lesbarkeit KEINEN StringBuffer verwenden. Der Performanceverlust zur Laufzeit steht in keinem Verhältnis zum Performanceverlust beim Lesen. :wink:
2) Das ist kein HQL was du verwendest. Schreib doch einfach
Code:
		String s = "SELECT feature FROM Feature feature WHERE " +
				"(SDO_NN (feature.f_geom, :point2, 'SDO_NUM_RES = :nnNumRes :unit') 1) = 'TRUE' AND " +
	    		"(SDO_WITHHIN_DISTANCE(feature.f_geom, :point2, ' DISTANCE = :withinDistance :unit') = 'TRUE' AND f_ft_id = :featureType";
		Query query = session.createQuery(s);
		query.setString("point", point2.toString());
		query.setInteger("nnNumRes", nnNumRes);
		query.setString("unit", unit);
		query.setInteger("withinDistance", withinDistance);
		query.setInteger("featureType", featureType);
		query.list();

ms
 
M

maki

Gast
Zur StringBuffer-Notlösung.
1) Zur besseren Lesbarkeit KEINEN StringBuffer verwenden. Der Performanceverlust zur Laufzeit steht in keinem Verhältnis zum Performanceverlust beim Lesen. icon_wink.gif
:toll:

Der Kompiler ersetzt sowieso String + String durch einen Stringbuilder wenn möglich.
 

ms

Top Contributor
Öhm ... was genau passiert eigentlich in SDO_GEOMETRY( ... ), SDO_NN( ... ) und SDO_WITHHIN_DISTANCE ( ... ) ?

ms
 

y0dA

Top Contributor
Hi!
Also bei meiner Iteration wird nur gelesen! Im Genaueren wird mit Oracle Spatial Funktionen gearbeitet.

Ich dachte immer wenn ich spezielle Funktionen einer DB ausführe, müsse ich das mit SQL und nicht mit HQL machen - blödsinn?
Weiters ist es sinnvoll solche Funktionen über eine View aufzurufen, sprich wäre das schneller als das Statement in Java zu erstellen?

Öhm ... was genau passiert eigentlich in SDO_GEOMETRY( ... ), SDO_NN( ... ) und SDO_WITHHIN_DISTANCE ( ... ) ?
Hier wird der nearest neighbour (eigentlich die 10 nähesten) zu einer Geokoordinate innerhalb einer gewissen Distanz gesucht


**EDIT**
Code:
		public static List<FeatureModel> getNearestNeighbour4Point(final double[] point, final int nnNumRes,
			final String unit, final int featureType, final int withinDistance, final int srid) {	

		StringBuffer point2 = new StringBuffer();
		point2.append(" SDO_GEOMETRY( ");
		point2.append(FeatureDB.POINT_GTYPE);
		point2.append(", ");
		point2.append(srid);
		point2.append(", ");
		point2.append("SDO_POINT_TYPE( ");
		point2.append(point[0]);
		point2.append(", ");
		point2.append(point[1]);
		point2.append(", null), null, null)");	
		
		String s = "SELECT feature FROM Feature feature WHERE " + 
			"(SDO_NN (feature.f_geom, :point2, 'SDO_NUM_RES = :nnNumRes :unit') 1) = 'TRUE' AND " + 
			"(SDO_WITHHIN_DISTANCE(feature.f_geom, :point2, ' DISTANCE = :withinDistance :unit') = 'TRUE' AND f_ft_id = :featureType"; 
			
		Session session = HibernateUtil.getCurrentSession();
		List<FeatureModel> list = null;	
		
		try {
			Query query = session.createQuery(s); 
			query.setString("point", point2.toString()); 
			query.setInteger("nnNumRes", nnNumRes); 
			query.setString("unit", unit); 
			query.setInteger("withinDistance", withinDistance); 
			query.setInteger("featureType", featureType); 
			query.list(); 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session = null;
		}
		return list;
	}
Wenn ich das so ausführen möchte, ohne Transaction bekomme ich folgende Exception:
Code:
org.hibernate.HibernateException: createQuery is not valid without active transaction
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)
	at $Proxy0.createQuery(Unknown Source)
	at at.pcd.wam.technologie.persistence.db.FeatureDB.getNearestNeighbour4Point(FeatureDB.java:74)
	at at.pcd.wam.technologie.controller.FeatureController.doMatchPoint(FeatureController.java:217)
	at at.pcd.wam.technologie.controller.FeatureController.evaluateTrackSegmentList(FeatureController.java:135)
	at at.pcd.wam.technologie.batch.RunBatch.main(RunBatch.java:123)
 

SnooP

Top Contributor
vermutlich brauchst du bei Queries also grundsätzlich eine Transaction, weil er ja nicht weiß, ob du nen update oder nur nen select machen willst und imho kann man tatsächlich nicht auf jede Funktion von Oracle via HQL zugreifen, das wird im jeweiligen Dialect geregelt.. so sachen wie to_date etc. gehen imho - aber was nearest-neighbour angeht wäre ich kritisch ;)

sprich... doch SQL direkt verwenden... und auf Prepared Statements verzichten... weil - die werden eh überbewertet ;)
 

y0dA

Top Contributor
Also brauche ich nun doch immer eine Transaktion, egal was ich mache?
Naja das hat nicht wirklich was mit speziellen DB Funktionen zu tun, ein einfaches "select * from" schmeißt denselben Fehler

Code:
public static void main(String[] args) {
		String stmt1 = "FROM feature where f_id = 232861";
		
		Session session = HibernateUtil.getCurrentSession();

		try {
			Query q = session.createQuery(stmt1);
			List<FeatureModel> l = q.list();
			
			/* commit and close session */
			System.out.println("passt");
		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			session = null;
		}

	}

Weiters stelle ich die ganzen Fragen ja weil ich, so wie es momentan ist, ein erhebliches Performance Problem habe. Deshalb wurde mir gesagt, ich soll die Transactionen rausnehmen wo nicht benötigt - geht nun ja anscheinend nicht...
 

ms

Top Contributor
Da hab ich wohl in diesem Punkt übereifrig von JDBC auf Hibernate geschlossen :shock: :###

Tatsächlich ist es so, dass hibernate immer Transaktionsklammern benötigt.
Nachzulesen hier unter Punkt 11.2: http://www.hibernate.org/hib_docs/reference/en/html/transactions.html

Dadurch dass ich Spring verwende, sind natürlich immer Transaktionsklammern vorhanden um die man sich im Code nicht kümmern muss. Dagegen sind bei schreibenden Statements fehlende Transaktionsklammern bei Verwendung von reinem JDBC eine häufige Stolperfalle.

Zu deinem Performanceproblem: die Transaktionen sind höchstwahrscheinlich nicht schuld daran.
Wie wirkt sich das Performanceproblem aus?
Wieviel Datensätze werden denn abgearbeitet?

ms
 

y0dA

Top Contributor
Zu deinem Performanceproblem: die Transaktionen sind höchstwahrscheinlich nicht schuld daran.
Wie wirkt sich das Performanceproblem aus?
Wieviel Datensätze werden denn abgearbeitet?
In einem anderen Thread wurde mir aber mitgeteilt dass eben diese Transactions schuld daran seien, denn ich iteriere über eine Liste in meiner Businesslogik und für jeden Eintrag in der Liste muss ich min. 2 Stmts (max 3) gegen die DB absetzen (eben diese nearest neighbour Geschichte von oben). Die Liste hat 1354 Einträge und für jeden Eintrag werden min. 2mal Transactionen begonnen und beendet (siehe Code von oben).
Ahja für das iterieren mit den stmts absetzen braucht mein Programm im Moment 9 Minuten!!!

Nun weiß ich echt nicht mehr wie ich hier etwas an der Performance ändern kann. Folgende Ideen:

+) Das Stmt statt mit StringBuffer oder Stringverkettung in dem entsprechendem hbm file als <sql-query> reinschreiben?

+)Das Stmt mehr oder weniger in eine View schreiben und dann die View aufrufen (kA ob das einen Unterschied macht)

+)Für diese 1354 Sätze nur eine Transaction benutzen - obwohl ich noch nicht so ganz weiß wie ich das umsetzen soll, dass ich keinen Businesscode in der DAO habe.
 

ms

Top Contributor
Ok, dann versuche als erstes einmal nur eine Transaktion zu verwenden.
Auch wenn im ersten Schritt die Businesslogik im DAO ist, zum analysieren des Problems ist das sicher legitim.
Refactoring kannst du nachher auch noch machen.
Wie schon in dem Beispiel von mir weiter oben, die For-Schleife über alle Listeneinträge IN dem try-catch-Block mit der Transaktion.

ms
 
G

Gast

Gast
Hi!
Kam erst heute wieder dazu auf meiner Spielwiese weiter zu arbeiten, folgendes Problem besteht:

Code:
org.hibernate.HibernateException: createQuery is not valid without active transaction
	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)
	at $Proxy0.createQuery(Unknown Source)
	at at.pcd.wam.technologie.persistence.db.FeatureDB.getNearestNeighbour4Point(FeatureDB.java:74)
	at at.pcd.wam.technologie.controller.FeatureController.doMatchPoint(FeatureController.java:217)
	at at.pcd.wam.technologie.controller.FeatureController.evaluateTrackSegmentList(FeatureController.java:135)
	at at.pcd.wam.technologie.batch.RunBatch.main(RunBatch.java:123)

Sprich ich habe nun nur eine transaction jedoch wird nach dem ersten Stmt die transaction geschlossen obwohl ich weder die session noch die transaction schliesse oder commite.

hier meine hibernate config, vllt fehlt was:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
	<property name="hibernate.connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="hibernate.connection.password">navteq</property>
	<property name="hibernate.connection.url">
		jdbc:oracle:thin:@192.11.100.207:1521:XE
	</property>
	<property name="hibernate.connection.username">navteq</property>
	<property name="hibernate.dialect">
		org.hibernate.dialect.OracleDialect
	</property>
	<property name="myeclipse.connection.profile">
		ORACLE_SPATIAL_VM
	</property>
	<property name="connection.url">
		jdbc:oracle:thin:@192.11.100.207:1521:XE
	</property>
	<property name="connection.username">navteq</property>
	<property name="connection.password">navteq</property>
	<property name="connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="dialect">
		at.pcd.wam.technologie.persistence.custom.type.OracleSpatialDialect
	</property>

	
	<property name="current_session_context_class">thread</property>

	
	<property name="hibernate.show.sql">true</property>
	
	
	<mapping
		resource="at/pcd/wam/technologie/persistence/hbm/GPSToursModel.hbm.xml" />
	<mapping
		resource="at/pcd/wam/technologie/persistence/hbm/FeatureModel.hbm.xml" />

</session-factory>
</hibernate-configuration>
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Hibernate Session closed nach Transaction commit? Datenbankprogrammierung 7
krgewb Hibernate: Fremdschlüssel wird nicht erzeugt Datenbankprogrammierung 2
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
F GWT und Hibernate - gwt.dev.Compler not found Datenbankprogrammierung 3

Ähnliche Java Themen


Oben