سؤال

أحاول فراغ قاعدة بيانات 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 عرض لمعرفة ما إذا كان هذا هو الحال. إذا كنت تستطيع أن ترى المورد الذي يتم تأمينه، فيمكنك البدء في معالجة هذه المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top