JDBC Postgres مهلة فراغ
-
16-09-2019 - |
سؤال
أحاول فراغ قاعدة بيانات Postgres الخاصة بي عن طريق تشغيل تعليمات SQL التالية داخل Java:
Vacuum Verbose تحليل
في بعض الأحيان يبدو فقط "شنق" هل هناك أي طريقة نظيفة لإحباط العملية؟ لقد حاولت
تعيين BECKTION_TIMEOUT إلى XXXX
لكنني أحصل على رسالة الخطأ "لا يمكن تشغيل الفانكوم داخل كتلة المعاملة"
المحلول
لقد اختبرت للتو و "فراغ" يكرم "Beystory_Timeout". مثال البرنامج:
import java.sql.*;
class test
{
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");
Connection connection =
DriverManager.getConnection(
"jdbc:postgresql://hostname/dbname",
"username",
"password"
);
connection.createStatement().executeUpdate(
"set statement_timeout to 500"
);
connection.createStatement().executeUpdate(
"vacuum analyze"
);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
أحصل على الخطأ التالية:
org.postgresql.util.PSQLException: ERROR: canceling statement due to statement timeout
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:299)
at test.main(test.java:14)
ربما يجب عليك (مؤقت) تمكين AutoCommit على اتصالك.
نصائح أخرى
يمكن أن يحدث هذا الخطأ إذا كان خادم Postgeres يأخذ الكثير من الوقت لتحميل البيانات IE إذا كان للحصول على استعلام معين، فمن النتائج كثيرة جدا، وسوف يستغرق الأمر وقتا لتحميل ذلك وسيقوم برمي هذا الاستثناء.
لا أعتقد أن هناك طريقة جيدة (IE آمنة) لقتل العملية بخلاف إعادة بدء تشغيل قاعدة البيانات. أنا لست على علم بأي خيار مهلة المعاملات أيضا.
أفضل حل هو معرفة ما يسبب تعليق وإصلاح هذه المشكلة. من المحتمل أن يكون الفراغ ينتظر قفل المعاملة لتكون إصداره. استخدم ال pg_locks
عرض لمعرفة ما إذا كان هذا هو الحال. إذا كنت تستطيع أن ترى المورد الذي يتم تأمينه، فيمكنك البدء في معالجة هذه المشكلة.