Re: One question about setting query timeout.

From: Dave Cramer <pg(at)fastcrypt(dot)com>
To: zhangyuanchao <zhangyuanchao(at)highgo(dot)com(dot)cn>
Cc: List <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: One question about setting query timeout.
Date: 2014-02-10 11:18:06
Message-ID: CADK3HH+N6Dcot9OT0VnwyfkxEhEZ_oNWcNoHiTOztTFWWNwPZQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

I think this is a known issues. What version of the driver are you using ?

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca

On Sun, Feb 9, 2014 at 10:46 PM, zhangyuanchao
<zhangyuanchao(at)highgo(dot)com(dot)cn>wrote:

> Hi,
> I have a question about setting query timeout by jdbc.
> When tested my application with Tomcat7.0 and loadrunner,my tomcat's
> configure file is like this:
> <Resource ......
> jdbcInterceptors="QueryTimeoutInterceptor(queryTimeout=600)"
> ....../>.
> After setting like above ,tomcat will call the jdbc's setQueryTimeout
> function and set the query timeout to 600seconds for each statement.
> Next,i start my test with 150 concurrency.After about 10 minutes later,i
> found the response time was much longer than before.At that moment,i
> found there were a lot of statement object in the heap memory of the
> JVM.And the JVM's gc could not clean these objects,because they were referenced
> by the TimerTask.So i read the source code of the jdbc and Timer class,i
> found the mainloop function of the Timer calss can cause the problem.This
> is the code of mainloop function in Timer class and i think the red colour
> text is that what cause the problem:
>
> private void mainLoop() {
> while (true) {
> try {
> TimerTask task;
> boolean taskFired;
> synchronized(queue) {
> // Wait for queue to become non-empty
> while (queue.isEmpty() && newTasksMayBeScheduled)
> queue.wait();
> if (queue.isEmpty())
> break; // Queue is empty and will forever remain;
> die
>
> // Queue nonempty; look at first evt and do the right
> thing
> long currentTime, executionTime;
> task = queue.getMin();
> synchronized(task.lock) {
> if (task.state == TimerTask.CANCELLED) {
> queue.removeMin();
> continue; // No action required, poll queue
> again
> }
> currentTime = System.currentTimeMillis();
> executionTime = task.nextExecutionTime;
> if (taskFired = (executionTime<=currentTime)) {
> if (task.period == 0) { // Non-repeating,
> remove
> queue.removeMin();
> task.state = TimerTask.EXECUTED;
> } else { // Repeating task, reschedule
> queue.rescheduleMin(
> task.period<0 ? currentTime -
> task.period
> : executionTime +
> task.period);
> }
> }
> }
> if (!taskFired) // Task hasn't yet fired; wait
> queue.wait(executionTime - currentTime);
> }
> if (taskFired) // Task fired; run it, holding no locks
> task.run();
> } catch(InterruptedException e) {
> }
> }
> }
> }
> So,i want to ask if there is any solution for this problem.
> Thanks very much.
>
>
>

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message zhangyuanchao 2014-02-11 07:01:29 Re: One question about setting query timeout.
Previous Message zhangyuanchao 2014-02-10 03:46:33 One question about setting query timeout.