pgjdbc-ng Плохо сформированный регион: - PullRequest
0 голосов
/ 25 февраля 2019

В настоящее время я пытаюсь создать модуль, который будет прослушивать любые изменения через триггер на Postgres.Я использую pgjdbc-ng ver 0.8.2, скачаю JAR из maven repo central и добавлю его в качестве ссылки на проект.

Ниже приведен код, который я использовал:

public class ListenNotify
{
// Create the queue that will be shared by the producer and consumer
private BlockingQueue queue = new ArrayBlockingQueue(10);

    // Database connection
    PGConnection connection;

    public ListenNotify()
    {
        // Get database info from environment variables
        /*
        String DBHost = System.getenv("DBHost"); 
        String DBName = System.getenv("DBName");
        String DBUserName = System.getenv("DBUserName");
        String DBPassword = System.getenv("DBPassword");
        */
        String DBHost = "127.0.0.1"; 
        String DBName = "dbname";
        String DBUserName = "postgres";
        String DBPassword = "postgres";
        // Create the listener callback
        PGNotificationListener listener = new PGNotificationListener()
        {
            @Override
            public void notification(int processId, String channelName, String payload)
            {
            // Add event and payload to the queue
            queue.add("/channels/" + channelName + " " + payload);
            }
        };

        try
        {
            // Create a data source for logging into the db
            PGDataSource dataSource = new PGDataSource();
            dataSource.setHost(DBHost);
            dataSource.setPort(5432);
            dataSource.setDatabaseName(DBName);
            dataSource.setUser(DBUserName);
            dataSource.setPassword(DBPassword);

            // Log into the db
            connection = (PGConnection) dataSource.getConnection();

            // add the callback listener created earlier to the connection
            connection.addNotificationListener(listener);

            // Tell Postgres to send NOTIFY q_event to our connection and listener
            Statement statement = connection.createStatement();
            statement.execute("LISTEN q_event");
            statement.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    /**
    * @return shared queue
    */
    public BlockingQueue getQueue()
    {
        return queue;
    }

    /**
    *
    * main entry point
    *
    * @param args
    */
    public static void main(String[] args)
    {
    // Create a new listener
        ListenNotify ln = new ListenNotify();

        // Get the shared queue
        BlockingQueue queue = ln.getQueue();

        // Loop forever pulling messages off the queue
        while (true)
        {
            try
            {
                // queue blocks until something is placed on it
                String msg = queue.take().toString();

                // Do something with the event
                System.out.println(msg);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }
}

Поработает, я получил исключение:

Плохо сформированный регион: Индонезия [по индексу 0]

Я прочитал официальный мерзавец, сказав, что он должен быть исправлен в каком-то номере выпуска.

Как применить это исправление?

Спасибо

1 Ответ

0 голосов
/ 12 апреля 2019

Я знаю, что немного поздно;)

У меня была такая же проблема, и я также прочитал, что проблема была решена.Но так не кажется.В любом случае проблема заключается в том, что при создании базы данных postgres для LC_COLLATE, вероятно, задано значение Indonesiaian_Indonesia.1252.При попытке установить соединение это значение сравнивается с языковым стандартом Java.В классе Java Locales значение, вероятно, находится на вашем языке, поэтому запись не может быть найдена.Однако для решения этой проблемы вы можете установить значение по умолчанию для локалей Java на английском.Это, конечно, не лучший способ решить проблему, но это работает.Для безопасности я бы поставил обратно после того, как соединение установлено

. Вы можете установить значение по умолчанию следующим образом:

Locale.setDefault(Locale.ENGLISH)

...