
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;
}
}
* 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.