Запрос проверки в org.apache.tomcat.jdbc.pool - PullRequest
0 голосов
/ 23 августа 2011

В последнее время я провожу некоторые тесты с новым пулом соединений Tomcat JDBC (org.apache.tomcat.jdbc.pool, версия 7.0.20). Я понимаю, как использовать запрос проверки, когда я, например, перезагрузка базы данных и пул теряет все соединения, он автоматически пытается восстановить их.

Вот код инициализации:

...

PoolProperties p = new PoolProperties();
p.setUrl(connString);
p.setDriverClassName("org.postgresql.Driver");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT version();");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(maximumDbConnections);
p.setInitialSize(1);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(minimumIdleDbConnections);
p.setMaxIdle(maximumIdleDbConnections);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setInitSQL("SET application_name = 'My Server'");
datasource = new DataSource();
datasource.setPoolProperties(p);

...

Затем я запускаю таймер и каждый раз, когда он срабатывает, я получаю соединение из пула:

...

Connection conn = App.datasource.getConnection();

...

Когда я загружаю базу данных, она не пытается восстановить соединения, как указано, я всегда получаю следующее исключение:

[2011-08-22 23:50:53,066][871009][ERROR]{DbPollThread - 1}  [0144] SQLException while checking for hangig jobs
java.sql.SQLException: Connection has already been closed.
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:118)
    at $Proxy2.prepareStatement(Unknown Source)
    at org.voxtelo.faxserver.internal.database.FaxDatabaseHandler.resetOrDeactivateHangingJobs(FaxDatabaseHandler.java:404)
    at org.voxtelo.faxserver.internal.database.FaxDatabaseHandler.pollJobsFromDB(FaxDatabaseHandler.java:884)
    at org.voxtelo.faxserver.internal.database.FaxDatabaseHandler.access$1(FaxDatabaseHandler.java:882)
    at org.voxtelo.faxserver.internal.database.FaxDatabaseHandler$PollDatabaseTask.run(FaxDatabaseHandler.java:940)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

Ответы [ 2 ]

0 голосов
/ 19 мая 2012

Позаботьтесь о setValidationInterval(30000), поскольку это означает, что запрос проверки будет выполняться каждые 30 секунд.Я думаю, что безопаснее установить это значение в 0, чтобы запускать запрос проверки каждый раз, когда запрашивается соединение.

0 голосов
/ 23 августа 2011

Наконец-то я выяснил проблему сам. Код

conn = App.datasource.getConnection();

где я получаю соединение больше не было достигнуто, когда было сгенерировано исключение. Таким образом, все опросы по-прежнему делались со старой, разорванной связью. Теперь я убедился, что conn = App.datasource.getConnection (); всегда вызывается перед операцией БД, и все работает как положено.

...