pgjdbc-ng Плохо сформированный регион:
В настоящее время я пытаюсь сделать модуль, который будет прослушивать любые изменения через триггер на 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]
Я прочитал официальный мерзавец, говоря, что это должно быть исправлено в некотором номере выпуска.
Как применить это исправление?
Спасибо
0 ответов
Я знаю, что это немного поздно;)
У меня была такая же проблема, а также прочитал, что проблема была решена. Но так не кажется. В любом случае проблема заключается в том, что при создании базы данных postgres для LC_COLLATE, вероятно, задано значение Indonesiaian_Indonesia.1252. При попытке установить соединение это значение сравнивается с языковым стандартом Java. В классе Java Locales значение, вероятно, находится на вашем языке, поэтому запись не может быть найдена. Однако для решения этой проблемы вы можете установить значение по умолчанию для локалей Java на английском. Это, конечно, не лучший способ решить проблему, но это работает. В целях безопасности я бы поставил обратно после установления соединения
Вы можете установить значение по умолчанию следующим образом:
Locale.setDefault(Locale.ENGLISH)