Leider setTimeout ist nicht für JDBC/Postgres implementiert. Gibt es eine Möglichkeit, dies zu simulieren oder zu umgehen? Funktionell möchte ich die Abfrage ausführen und die Pause dann, wenn es länger als N Sekunden dauertJDBC postgres Abfrage mit einem Timeout
Antwort
Die "statement_timeout" sieht aus wie Sie wollen.
SET statement_timeout TO 1000; -- for a second
<your_query_here>;
RESET statement_timeout; -- reset
Sie sind besser dran mit RESET statement_timeout; nachdem die Abfrage abgeschlossen ist - falls es einen Standardwert gibt ... –
Jetzt behoben, danke! –
Getestet auf pgAdmin3. Funktioniert nur, wenn das SET-Statement_timeout getrennt von der eigentlichen Abfrage ausgeführt wird. Wenn pgAdmin3 zusammen ausgeführt wird, verwendet es, was auch immer der Timeout-Wert war, und verwendet nicht den, der mit der Abfrage bereitgestellt wurde. – Babar
Eine Möglichkeit könnte sein, zu versuchen, die Abfrage in einer Timer-Klasse auszuführen. Wirf eine Ausnahme, wenn der Timer endet, ohne dass ein Wert zurückgegeben wird.
Hibernate und JDO liefern ein solches Konstrukt. Vielleicht wären sie eine gute Alternative für dich.
Sie müssen vorsichtig sein, wie dies implementiert wird; Wenn es falsch gemacht wird, enden Sie mit vielen blockierten Threads, die SQL-Verbindungen enthalten, die gerade ignoriert werden. Ein Teil des Problems hier ist, dass Sie einen Thread nicht dazu zwingen können, eine Ausnahme auszulösen, wenn er gerade dabei ist, etwas zu tun. –
Was wäre, wenn Sie c3p0 für Ihre dataSource verwenden würden? Es hat viele konfigurierbare Optionen und für verschrobene Datenbanken und Netzwerke zum Beispiel acquireRetryAttempts, acquireRetryDelay und breakAfterAcquireFailure.
Mit dem Schlüsselwort LOCAL wird der Gültigkeitsbereich von statement_timeout auf die aktuelle Transaktion beschränkt. Auf diese Weise wird die Zeitüberschreitung zurückgesetzt, wenn etwas schief geht (z. B. Zeitüberschreitung).
BEGIN TRANSACTION;
SET LOCAL statement_timeout TO 1000; -- one-second timeout
SELECT COUNT(*) FROM really_huge_table; -- your slow query
ROLLBACK; -- reset
- 1. JDBC Postgres Vakuum Timeout
- 2. JDBC Postgres statement_timeout
- 3. JDBC- Postgres, Verbindung verweigert
- 4. JDBC getConnection Timeout Problem
- 5. So brechen Sie eine Postgres-Abfrage in Java/JDBC ab
- 6. Postgres rekursive Abfrage mit row_to_json
- 7. Mit einer Abfrage in einem anderen in JDBC-Programmierung
- 8. Heroku kann Postgres JDBC-Treiber nicht finden
- 9. Von Postgres mit JDBC abgerufene Zeilen sind alle gleich
- 10. Postgres JDBC-Laufwerk in SparkR einbinden
- 11. Postgres kombinieren Update-Abfrage
- 12. Postgres DISTINCT Abfrage Ausgabe
- 13. Wie eine Abfrage in Postgres auf „namen“
- 14. Oracle Abfrage Timeout
- 15. eine Postgres Abfrage Optimierung
- 16. Postgres: Abfrage nach datetime optimieren
- 17. Abfrage Char unterschiedliche Postgres
- 18. Verschachtelte Postgres-Abfrage
- 19. Rails 4 Postgres Abfrage Fehler
- 20. Oracle - OCI Abfrage-Timeout
- 21. Node.js - mysql Abfrage Timeout
- 22. Verbinden mit Postgres aus einem Docker-Container
- 23. Wie Abfrage für Double mit Spring JDBC Vorlage Abfrage
- 24. Langsame activerecord/postgres Abfrage nicht mit Index
- 25. Abfrage Rails Postgres mit Array-Datentyp
- 26. Wie in Postgres-Abfrage Rang
- 27. Django Abfrage verschwinden in Postgres
- 28. Postgres: Get ausführbare Abfrage von der Abfrage mit Parametern
- 29. konvertieren Postgres Abfrage zu Django Abfrage
- 30. Verlangsamen Sie PostgreSQL mit JDBC
Ich fand diese Frage und Antwort hilfreich auch für ein Python/psycopg2 Problem, das ich angetroffen habe. Psycopg2 scheint Timeout-Einstellungen zum Zeitpunkt der Verbindung zuzulassen, aber diese Schnittstelle wurde in meinem Fall abstrahiert. Fügen Sie diesen Kommentar hinzu, um anderen Nutzern bei der Suche nach SO zu helfen. – SetJmp