Идентифицировать специфическое исключение, когда связь быть восстановленной в удаленную BD в Java 8 и c3p0

У меня есть проект в Netbeans, который присоединяется в удаленную базу данных используя пул связей с книжным магазином c3p0. Связь с BD в производстве не является заслуживающей доверия, так что, чтобы воспроизводить эту просто активную сцену и я дезактивирую мою связь ethernet. Моя проблема состоит, в том, что восстановив связь ethernet и попробовав приобретать связь в BD с пула связей, мне производится SQLException, которую я хочу идентифицировать. Мой код - этот:

// https://hashblogeando.wordpress.com/2016/04/25/pooling-de-conexiones-a-base-de-datos-con-c3p0-y-java/
cpds = new ComboPooledDataSource();
cpds.setDriverClass("org.postgresql.Driver");
cpds.setJdbcUrl("jdbc:postgresql://someserver:5432/sample1");
  cpds.setUser("usuario");
  cpds.setPassword("contrasena"); 
  // Numero de conexiones con las que iniciara el pool
  cpds.setInitialPoolSize(1);
  // Minimo de conexiones que tendra el pool
  cpds.setMinPoolSize(1);
  // Numero de conexiones a crear cada incremento
  cpds.setAcquireIncrement(1);
  // Maximo numero de conexiones
  cpds.setMaxPoolSize(50);
  // Maximo numero de reintentos para conectar a base de datos
  cpds.setAcquireRetryAttempts(1);
  // Que se genere una excepcion si no se puede conectar
  cpds.setBreakAfterAcquireFailure(true);
// si pongo cpds.setBreakAfterAcquireFailure(false); no se genera la excepción
// pero yo quiero que se genere y poderla identificar

  try(Connection con = cpds.getConnection()) // la excepción se lanza aquí
  {
      // código para insertar y actualizar valores
  }
  catch(SQLException e)
  {
      // quiero identificar la excepción que se lanza al restablecerse la conexión con la bd, no al caerse la conexión
      System.err.println(e.getMessage());
        System.err.println(e.getCause());
        System.err.println(Arrays.toString(e.getStackTrace()));
  }

Сообщение исключения:

"и = (java.sql. SQLException) java.sql. SQLException: An SQLException was provoked by the following failure: com.mchange.v2.resourcepool. ResourcePoolException: Attempted to использовал в closed or broken resource пул"

Это - то, что печатается с System.err.println(e.getCause())

com.mchange.v2.resourcepool. ResourcePoolException: Attempted to использовал в closed or broken resource пул

И это - то, что печатается с System.err.println(Arrays.toString(e.getStackTrace()))

[com.mchange.v2.sql. SqlUtils.toSQLException (SqlUtils.java:118), com.mchange.v2.sql. SqlUtils.toSQLException (SqlUtils.java:77), com.mchange.v2.sql. SqlUtils.toSQLException (SqlUtils.java:74), com.mchange.v2.c3p0.impl. C3P0PooledConnectionPool.checkoutPooledConnection (C3P0PooledConnectionPool.java:694), com.mchange.v2.c3p0.impl. AbstractPoolBackedDataSource.getConnection (AbstractPoolBackedDataSource.java:140), mypackage.myClass. FunctionThatTriesToConnect (myClass.java:119)]

есть какой-то способ идентифицировать специально это исключение и не другую SQLException?

Edit: Если я помещаю cpds.setBreakAfterAcquireFailure(false) выступление вырождается мне много. Я не знаю, ли он из-за книжного магазина c3p0 или мое приложение, но оно я функционирует лучше с cpds.setBreakAfterAcquireFailure(true).

Еще я готов протестировать решение kdoomsday.

Another Edit:

Протестировав решение kdoomsday я нашел, что getErrorCode() всегда возврати нуль в этой сцене. В действительности, докуда я смог подтверждать, нет способа знать, восстанавливается ли связь, после упав раньше, не жертвуя выступления. В конце концов я был должен зависеть от timer, который проверял связь каждые мало минуты и возобновлял poll, если связь восстанавливается, после падая.

1
задан 27.01.2017, 22:27
0 ответов

Класс SQLException содержит параметр, который соответствует коду ошибки. Ты можешь получать эту стоимость посредством функции getErrorCode() на исключении. Я не могу гарантировать, но производит ли он различный код, что для другого типа исключений, ты можешь использовать это. Если не, ты будешь должен делать сравнение против сообщения причины.

1
ответ дан 03.12.2019, 17:41