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.
>
>
>
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. |