JPA: Synchronisierung erzwingen / Cross-Group-Transactions

Objektorientierte Programmiersprache auf Basis einer virtuellen Maschine (https://www.oracle.com/java/)
Antworten
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

JPA: Synchronisierung erzwingen / Cross-Group-Transactions

Beitrag von nufan » Sa Feb 02, 2013 4:16 pm

Tag :)

Letztens hab ich 4-5 Stunden damit verbracht den JDBC-Treiber für MySQL zum Laufen zu bringen* - um dann zu merken, dass der Google App Engine kein JDBC unterstützt. Also bin ich auf die mehrfach empfohlene Java Persistence API (JPA) umgestiegen. Das ganze (NoSQL-Zeug) funktioniert prinzipiell auch, nur hab ich noch ein Problem: Die Datenbank (sowohl lokal als auch online) braucht ewig um sich mit meinen Querys zu synchronisieren.
Beispiel: Ich lösche alle Elemente aus meiner Datenbank, füge danach 2 neue ein und gebe sie aus. Das Ergebnis dabei ist unvorhersehbar. Manchmal sind es 2, oft auch nur 1 oder gar 0. Bei mehrmaligen ausführen der Befehle können es auch schon mal 3-4 sein (obwohl vorher alles gelöscht wurde!). Nach einer Weile - und dabei kann es tatsächlich mehrere Sekunden dauern, also eine Computer-Ewigkeit - sind die Daten dann in dem von mir erwarteten Zustand.
Wenn ich die einzelnen Datenbank-Zugriffe jeweils in eine eigene Transaktion packe, bekomme ich die Exception, dass ich etwas wie "Cross-Group-Transactions" benötige. Was genau das ist und wie ich das verwende hab ich noch nicht herausgefunden. Außerdem hab ich (bis jetzt) nur ein einziges Entity in meiner Datenbank?!

Der Code sieht grob so aus:

Code: Alles auswählen

@Entity(name = "user")
public class User {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long userId;
	private String email;
        // ...

}

Code: Alles auswählen

public class UserDao {

	public static void addUser(final User user) {
		EntityManager em = null;
		try {
			em = Database.getInstance().createEntityManager();
			em.persist(user);
		} finally {
			if (em != null) {
				em.close();
			}
		}
	}

	public static void removeAllUsers() {
		EntityManager em = null;
		try {
			em = Database.getInstance().createEntityManager();
			Query query = em.createQuery("DELETE FROM user u");
			query.executeUpdate();
		} finally {
			if (em != null) {
				em.close();
			}
		}
	}

	@SuppressWarnings("unchecked")
	public static List<User> getAllUsers() {
		EntityManager em = null;
		List<User> users = null;
		try {
			em = Database.getInstance().createEntityManager();
			Query query = em.createQuery("SELECT u FROM user u");
			users = (List<User>) query.getResultList();
		} finally {
			if (em != null) {
				em.close();
			}
		}
		return users;
	}
}
Database.getInstance() gibt mir meine EntityManagerFactory zurück, die nur innerhalb des Database-Singleton angelegt wird. Hat irgendjemand eine Idee wie ich diese NoSQL-Datenbank zur Synchronisierung zwingen kann bzw. was genau diese Cross-Group-Transactions sind und wie ich sie verwende?


* Die jar-Datei muss nicht nur in den Projekteinstellungen angegeben werden, sondern auch unbedingt im Verzeichnis war/WEB-INF/lib/ liegen.


EDIT:
Der Umstieg auf Objectify mit dem entsprechenden now()-Aufruf hat geholfen.

jeanluc
Beiträge: 33
Registriert: Mo Apr 22, 2013 10:18 pm

Re: JPA: Synchronisierung erzwingen / Cross-Group-Transactio

Beitrag von jeanluc » Mo Apr 22, 2013 10:47 pm

Bei der Anwendungsentwicklung würde ich dir raten auf ein klassisches RDBMS zu setzen. Gibt ja auch einige einfache wie z.B. Apache Derby. Ist zwar schön was man mit den Google Services alles anstellen kann, aber zum einen machst du deine Anwendung davon abhängig und die Persistenz schwer austauschbar, zum anderen hast du einen SPOF (ja ich weiß, Google geht nie down). Die ganzen Fragen rund um Datenschutz mal ausgeklammert.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: JPA: Synchronisierung erzwingen / Cross-Group-Transactio

Beitrag von nufan » Di Apr 23, 2013 2:11 am

jeanluc hat geschrieben:Bei der Anwendungsentwicklung würde ich dir raten auf ein klassisches RDBMS zu setzen.
Wie gesagt hatte ich zuerst MySQL geplant, aber die Anforderungen kamen nicht von mir und machten das schließlich technisch praktisch unmöglich.

Antworten