2015-04-24 3 views
2

проблема с использованием c3p0. В большинстве случаев работает нормально, но в prod env за брандмауэрами иногда не удается проверить соединение. Проблема в том, что для распознавания соединения не требуется 15 минут. Пул не убеждает, так как другие соединения проверяются и используются счастливо в течение этой 15-минутной недели.c3p0 проверка связи займет 15 минут до сбоя

журналы:

23 Apr 2015 09:08:16.426 [EventProcessor-1] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Testing PooledConnection [[email protected]] on CHECKOUT. 

15 минут спустя:

23 Apr 2015 09:23:43.073 [EventProcessor-1] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Test of PooledConnection [[email protected]] on CHECKOUT has FAILED. 
java.sql.SQLException: Connection is invalid 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.testPooledConnection(C3P0PooledConnectionPool.java:572) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.finerLoggingTestPooledConnection(C3P0PooledConnectionPool.java:451) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.finerLoggingTestPooledConnection(C3P0PooledConnectionPool.java:443) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckout(C3P0PooledConnectionPool.java:336) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckout(BasicResourcePool.java:1727) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:553) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:756) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:683) [c3p0-0.9.5.jar:0.9.5] 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140) [c3p0-0.9.5.jar:0.9.5] 

, а затем еще несколько журналов:

23 Apr 2015 09:23:43.073 [EventProcessor-1] DEBUG c.m.v.r.BasicResourcePool - A resource could not be refurbished for checkout. [[email protected]] 
java.sql.SQLException: Connection is invalid 
... 
23 Apr 2015 09:23:43.074 [EventProcessor-1] DEBUG c.m.v.r.BasicResourcePool - Resource [[email protected]] could not be refurbished in preparation for checkout. Will try to find a better resource. 
23 Apr 2015 09:23:43.074 [C3P0PooledConnectionPoolManager[identityToken->67oy4j981qzvkd716hgow4|4177fc5c]-HelperThread-#2] DEBUG c.m.v.r.BasicResourcePool - Preparing to destroy resource: [email protected] 
23 Apr 2015 09:23:43.074 [EventProcessor-1] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Testing PooledConnection [[email protected]] on CHECKOUT. 
23 Apr 2015 09:23:43.074 [C3P0PooledConnectionPoolManager[identityToken->67oy4j981qzvkd716hgow4|4177fc5c]-HelperThread-#2] DEBUG c.m.v.c.i.C3P0PooledConnectionPool - Preparing to destroy PooledConnection: [email protected] 
23 Apr 2015 09:23:43.076 [C3P0PooledConnectionPoolManager[identityToken->67oy4j981qzvkd716hgow4|4177fc5c]-HelperThread-#2] DEBUG c.m.v.c3p0.impl.NewPooledConnection - Failed to close physical Connection: [email protected] 
java.sql.SQLRecoverableException: IO Error: Broken pipe 
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:612) ~[ojdbc6_g-11.2.0.1.0.jar:11.2.0.1.0] 
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:5094) ~[ojdbc6_g-11.2.0.1.0.jar:11.2.0.1.0] 
    at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:642) [c3p0-0.9.5.jar:0.9.5] 

c3p0 конфигурации:

 ComboPooledDataSource ods = new ComboPooledDataSource(); 
... 
     ods.setInitialPoolSize(5); 
     ods.setMinPoolSize(5); 
     ods.setMaxPoolSize(10); 
     ods.setMaxStatements(50); 

     ods.setTestConnectionOnCheckout(true); 

Так что ничего экзотического. Я знаю, что потеря связи возможна, следовательно, тестирование соединения при оформлении заказа. Любые идеи, почему так долго приходится проверять/выходить из строя? Мы используем базу данных Oracle. спасибо.

ответ

1

похоже, что это ситуация, когда соединение прерывается брандмауэром таким образом, что отклик вообще отсутствует, даже TCP ACK без данных.В этом случае запрос для проверки соединения никогда не вернется. Это находится на уровне драйвера socket/jdbc.

Решение:

  • узнать о разъединении брандмауэра политики (в нашем случае 1 часы)
  • набор c3p0.maxConnectionAge свойства, чтобы заставить c3p0 восстановить МАГИСТРАЛИ каждые Х секунды.
2

Во-первых, я полагаю, вы подтвердили, что нет проверок этого соединения между сообщениями журнала. Очевидно, вы ожидали бы множества сообщений, таких как ...

Testing PooledConnection [[email protected]] on CHECKOUT. 

... перед окончательным сообщением непосредственно перед сбоем. Многие из этих сообщений будут происходить намного раньше. Только окончательное сообщение перед самым провалом, в идеале, должно быть намного ближе к обнаружению отказа, чем 15 минут, которые вы видите.

Предполагая, что это последнее сообщение, подобное этому, проблема связана с тем, как ваши соединения умирают. c3p0 запускает тест, а затем ждет либо успешного завершения, либо исключения. Если ваше соединение умирает таким образом, что тест Connection просто висит в течение 15 минут, то вы можете увидеть, что видите.

Вот несколько предложений.

  1. Использование c3p0-х idleConnectionTestPeriod для обнаружения этих ошибок в идеале до клиента извлечений, так что клиенты реже испытывают длительные зависания. (Вы также можете проверить при регистрации.)
  2. Выясните, какой тест соединения запускается. Вы используете c3p0 0.9.5, поэтому, если ваш драйвер поддерживает его, тест по умолчанию - это вызов Connection.isValid(), который должен быть быстрым. Я не вижу ни одного из журналов, которые вы указали на трассировку стека фактического отказа теста (возможно, это усеченная первопричина Исключение? Это определенно будет регистрироваться на уровне FINER/DEBUG с помощью регистратора com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool). Проверьте (из трассировки стека), что ваш драйвер использует быстрый тест подключения isValid(), а не медленный тест соединения по умолчанию c3p0. Если это не так (предположительно, потому что ваш драйвер не поддерживает это), рассмотрите возможность установки быстрого preferredTestQuery.
  3. Вы можете попробовать maxAdministrativeTaskTime, но это, скорее всего, действительно поможет, если все, что висит в тесте Connection, отвечает на вызов interrupt().

В любом случае, я надеюсь, что это не совсем бесполезно!

+0

Привет, Стив, спасибо за ваш ответ. некоторые из этих вариантов помогут, но я думаю, что теперь я понимаю фактическую проблему - брандмауэр отбрасывает соединения таким образом, что вообще перестает отвечать на запросы. Я дам отдельный ответ с решением, которое сработало. – Vladimir

Смежные вопросы