У меня есть небольшое тестовое приложение, которое делает запросы к кластеру Postgresql с Первичным сервером (10.200.0.50) и Standby Server (10.200.0.51). Когда подключение к основному серверу не доступно, я хочу, чтобы приложение перешло в режим ожидания.Сбой при подключении PostgreSQL с использованием ошибки строки jdbc в приложении Java
Я последовал за последний раздел документации отсюда: https://jdbc.postgresql.org/documentation/head/connect.html
До сих пор у меня есть это:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Statement stmt = null;
Connection c = null;
try {
Class.forName("org.postgresql.Driver");
c = DriverManager
.getConnection("jdbc:postgresql://10.200.0.50,10.200.0.51:5432/replicationtest",
"postgres", "password");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM testtable;");
while(rs.next()) {
String name = rs.getString("name");
System.out.println(name);
}
rs.close();
int choice = s.nextInt();
ResultSet rs2 = stmt.executeQuery("SELECT * FROM testtable");
while(rs2.next()) {
String name = rs2.getString("name");
System.out.println(name);
}
rs2.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getClass().getName()+": "+e.getMessage());
System.exit(0);
}
s.close();
}
Сценарий А) Первичный сервер 10.200.0.50 вниз и резервный сервер 10.200.0.51 вверх.
Это прекрасно работает, есть немного задержка на первый, но затем приложение использует второй сервер, указанный в строке JDBC
Сценарий B) Оба основных и резервных серверов, когда я запустить приложение. Но после первого запроса, когда приложение ожидает nextInt(), я блокирую подключение до 10.200.0.50; Имитация первичного сбоя после успешного соединения.
При запуске сценария B, а затем вызвать второй запрос, я получаю сообщение об ошибке:
org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:317)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:432)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:358)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:305)
at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:291)
at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:269)
at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:236)
at com.rakuten.pgRecovery.Main.main(Main.java:59)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)