C3P0 закрытие полуоткрытых соединений - PullRequest
0 голосов
/ 31 мая 2018

В моем приложении я использую C3P0 для подключения к серверу БД.Здесь сервер БД работает за брандмауэром.

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

`"com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1" daemon prio=10 tid=0x00007fec0865d000 nid=0xc1fe runnable [0x00007fec4cb66000]
       java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:152)
        at java.net.SocketInputStream.read(SocketInputStream.java:122)
        at com.ingres.gcf.dam.IoBuff.fillBuffer(Unknown Source)
        at com.ingres.gcf.dam.IoBuff.next(Unknown Source)
        - locked <0x0000000782455468> (a com.ingres.gcf.dam.InBuff)
        at com.ingres.gcf.dam.InBuff.receive(Unknown Source)
        at com.ingres.gcf.dam.MsgIn.receive(Unknown Source)
        at com.ingres.gcf.dam.MsgConn.receive(Unknown Source)
        at com.ingres.gcf.jdbc.DrvObj.readResults(Unknown Source)
        at com.ingres.gcf.jdbc.JdbcConn.connect(Unknown Source)
        at com.ingres.gcf.jdbc.JdbcConn.<init>(Unknown Source)
        at com.ingres.gcf.jdbc.JdbcDrv.connect(Unknown Source)
        at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:81)
        - locked <0x0000000780025b10> (a com.mchange.v2.c3p0.DriverManagerDataSource)
        at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:96)
        - locked <0x0000000780025b70> (a com.mchange.v2.c3p0.WrapperConnectionPoolDataSource)
        at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1.acquireResource(C3P0PooledConnectionPool.java:89)
        at com.mchange.v2.resourcepool.BasicResourcePool.acquireUntil(BasicResourcePool.java:665)
        at com.mchange.v2.resourcepool.BasicResourcePool.access$500(BasicResourcePool.java:32)
        at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1206)
        at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:368)
    `

Есть ли возможность обойти эту ситуацию?

Используемая база данныхтакое VECTORWISE база данных.

1 Ответ

0 голосов
/ 31 мая 2018

Если чтение с сокета с точки зрения приложения зависает бесконечно - ни с успехом, ни с ошибкой с Exception - единственное, что c3p0 действительно может с этим поделать, - это дать им время и попытаться прервать их.

Показанная выше ошибка не в запросе, а в Connection получении.Вы можете попробовать установить maxAdministrativeTaskTime , чтобы тайм-аут.Очевидно, что если c3p0 не может получить Соединения, попытки использовать ваш DataSource все равно будут неудачными.Но они должны (в конце концов, после большого количества тайм-аутов, см. acquRetryAttempts и acquRetryDelay ) явно прервать с Exceptions для клиентов, а не просто ждать вечно

(Это зависит от восприимчивости зависаний к Thread.interrupt(). Если они не могут быть прерваны, maxAdministrativeTaskTime не может помочь.)

...