ich müsste in postgres mehrere Anfragen (mehr oder weniger) gleichzeitig stellen, die zu der gleichen Ausgabe führen sollen. Allerdings werden bei den Anfragen häufiger Zeitfunktionen wie now() verwendet.
Da die Funktionen in den unterschiedlichen Anfragen natürlich nicht exakt zeitgleich aufgerufen werden, war meine Idee, postgres eine feste Zeit zuzuweisen, sodass immer die gleiche Zeit zurückgegeben wird, egal wann die Anfrage ausgeführt wird.
Gibt es eine Möglichkeit postgres entsprechend zu konfigurieren?
Da ich dazu kaum etwas finde, wäre es auch schon hilfreich, wenn ich wüsste, wie ich einen eigenen NTP-Server aufsetzen kann (mit dem das Betriebssystem dann synchronisiert wird), der immer die gleiche Zeit zurückgibt…
test=# select now();
now
-------------------------------
2014-06-22 12:48:46.779917+02
(1 row)
Time: 43,697 ms
test=*# select now();
now
-------------------------------
2014-06-22 12:48:46.779917+02
(1 row)
Time: 0,075 ms
test=*# select * from foo;
ERROR: relation "foo" does not exist
LINE 1: select * from foo;
^
Time: 18,372 ms
test=*# select now();
now
-------------------------------
2014-06-22 12:48:46.779917+02
(1 row)
Merke: innerhalb einer Transaktion gibt now() immer die gleiche Zeit zurück: die Startzeit der Transaktion.
Danke zunächst einmal für die schnelle Antwort.
Allerdings komme ich mit einer Transaktion leider auch nicht weiter, da das ganze über JDBC läuft und ich dort ja keine zwei Ergebnismengen zurückgeben kann.
Oder gibt es hier vlt. doch eine Möglichkeit?
Doch, Transaktionen kann ich natürlich ausführen, aber ich kann immer nur eine Anfrage parallel ausführen, weil ich sonst eine Exception bekomme. Ich weiß zwar nicht, ob die Transaktion automatisch geschlossen wird, wenn ich eine weitere Anfrage stelle, allerdings kann ich pro Verbindung nur ein ResultSet offen halten. Da ich aber z.T. mehrere parallel brauche, muss ich mehrere Verbindungen zur Datenbank halten, was wiederum die Transaktion ausschließt…
Das stimmt nicht.
Du kannst pro Verbindung beliebig viele ResultSets offen halten (so viel wie halt in den Speicher passt). Allerdings nicht pro Statement. D.h. wenn Du pro Abfrage ein neues Statement erzeugst, kannst Du mehrere Abfragen in der gleichen Transaktion laufen lassen (allerdings nicht parallel)
Sowas müsste eigentlich gehen:
Connection dbConn = DriverManager.connect(...);
dbConn.setAutocommit(false); // wichtig!
Statement stmt1 = dbConn.createStatement();
Statement stmt2 = dbConn.createStatement();
ResultSet rs1 = stmt1.executeQuery("select ...."); // startet implizit eine Transaktion
ResultSet rs2 = stmt2.executeQuery("select ...."); // läuft in der gleichen Transaktion wie stmt1