I haven't looked at the source, but I'm willing to bet there is at least one sync block -- the pooling implementation would have to perform a brief sync when it borrows a connection object from the pool. In addition, if this is from a fresh startup of tomcat without a minIdle setting (default=0) in your Resource definition (I didn't see one in your original post), each parallel call to getConnection() will mean creating a new connection to the db because all previous connections are busy and none are being reused.

I'd be curious what this would look like with:
 a) a minIdle setting to establish a pool of connections on startup and
b) if the threads kept going over a few iterations releasing and reacquiring connections. Would the time keep going up or would it drop as connections start getting reused?

--David

[EMAIL PROTECTED] wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Daad,

[EMAIL PROTECTED] wrote:
| i think i don't get the utility of a connection pooling, since i have
this situation: 30 threads try to perform at same time a db access with
the call:
|
| new Database().doSomething()

Are you sure you're using your Database class in this way? I wouldn't be
surprised if you are creating a single Database object and using it
repeatedly.

Yes i'm sure, i'm using (new Database()).doSomething() always.

Are your threads actually running in parallel?


That's my question.

| [wed, 09 apr 2008 00:55:03] INFO      Database -> doSomething: 836
| [wed, 09 apr 2008 00:55:04] INFO      Database -> doSomething: 1444
| [wed, 09 apr 2008 00:55:04] INFO      Database -> doSomething: 2054
| [wed, 09 apr 2008 00:55:05] INFO      Database -> doSomething: 2417
| [wed, 09 apr 2008 00:55:05] INFO      Database -> doSomething: 3060
| [wed, 09 apr 2008 00:55:06] INFO      Database -> doSomething: 3647
| [wed, 09 apr 2008 00:55:07] INFO      Database -> doSomething: 4279
| [wed, 09 apr 2008 00:55:07] INFO      Database -> doSomething: 4967
| [wed, 09 apr 2008 00:55:08] INFO      Database -> doSomething: 5592
| [wed, 09 apr 2008 00:55:09] INFO      Database -> doSomething: 6208
| [wed, 09 apr 2008 00:55:09] INFO      Database -> doSomething: 7026
| [wed, 09 apr 2008 00:55:10] INFO      Database -> doSomething: 7455
| [wed, 09 apr 2008 00:55:10] INFO      Database -> doSomething: 8087
| [wed, 09 apr 2008 00:55:11] INFO      Database -> doSomething: 8705
| [wed, 09 apr 2008 00:55:12] INFO      Database -> doSomething: 9318
| [wed, 09 apr 2008 00:55:12] INFO      Database -> doSomething: 10040
| [wed, 09 apr 2008 00:55:13] INFO      Database -> doSomething: 11146
| [wed, 09 apr 2008 00:55:14] INFO      Database -> doSomething: 11702
| [wed, 09 apr 2008 00:55:14] INFO      Database -> doSomething: 12033
| [wed, 09 apr 2008 00:55:15] INFO      Database -> doSomething: 12658
| [wed, 09 apr 2008 00:55:16] INFO      Database -> doSomething: 13279
| [wed, 09 apr 2008 00:55:16] INFO      Database -> doSomething: 13897
| [wed, 09 apr 2008 00:55:17] INFO      Database -> doSomething: 14523
| [wed, 09 apr 2008 00:55:17] INFO      Database -> doSomething: 15139
| [wed, 09 apr 2008 00:55:18] INFO      Database -> doSomething: 15759
| [wed, 09 apr 2008 00:55:19] INFO      Database -> doSomething: 16411
| [wed, 09 apr 2008 00:55:19] INFO      Database -> doSomething: 17056
| [wed, 09 apr 2008 00:55:20] INFO      Database -> doSomething: 17672
| [wed, 09 apr 2008 00:55:20] INFO      Database -> doSomething: 18292

Every single operation takes more time than the previous operation. That
smells of a problem with resetting a counter. Isn't it interesting that
the logging statements show that all 30 threads completed within 18
seconds of each other, and each thread says that it took up to 18
seconds to complete? If these processes were sharing a single
connection, and they were taking 18 seconds to complete, the total time
would be 9 minutes, not 18 seconds.


As you can see from the code i pasted, start time is taken in getConnection() method and 
end time is taken in closeResources() method. So from the logs i understand that all 30 
threads arrive in getConnection() at same time (so all "start" variable of each 
Database instance is set to same timestamp (about)), but then seems that operation get 
enqueued, since the first thread that is able to quit needs 836ms, while the last one 
18292ms. That means the second thread that can perform the query waited that first thread 
complete the query. So, even if the second thread arrived to getConnection() at same time 
of the first, the second took almost double time because waited that the first complete 
the task. That's what i understood from logs... I didn't get what you said about 9 
minutes. If the operation takes 600-800ms (as first thread demonstrate), 30 x 600 = 
18000ms. So with one connection, if those 30 threads are enqueued, the total time is 18 
seconds, that is what happens. So i still think that one connection is shared only =\

If anybody know what to check on Mysql application to see if there is a sort of 
limitation on number of concurrent queries, please let me know.

Even if you had resource contention (which you shouldn't have with 600
shared connections), I would expect that some numbers would be low and
others were high -- essentially randomly distributed.

It's pretty clear to me that something else is going on... I'm guessing
that the connection pool (which one are you using?) is working just
fine, but either your "load test" code or your server-side database use
is being incorrectly used and/or incorrectly instrumented.


I'm using mysql-connector-java-5.1.5-bin.jar

| so i can't understand the meaning of maxActive parameter.. i thought
| that could be at most 600 concurrent connection.

~From the documentation: "The maximum number of active connections that
can be allocated from this pool at the same time, or negative for no limit."

Your expectation that 600 connections should be available is correct.
Although, 600 connections in a connection pool is a /lot/ of connections. ;)

- -chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkf8yAkACgkQ9CaO5/Lv0PAGtgCeL5O0jUrxfZZZM/3ix3pbmrWV
kgcAnR1wlDWpS9ez9FE/uNHzKptqTCmc
=mSOU
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to