2016-11-07 9 views
1

У меня есть небольшое тестовое приложение, которое делает запросы к кластеру 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) 

ответ

0

Фигурные это, мне нужно, чтобы обернуть мои запросы в попытке поймать и поймать ошибку, когда чтение не удается. После этого мне нужно открыть новое соединение, которое будет совершать циклические действия на переданных узлах и, таким образом, получить хорошее соединение, например, в сценарии A