Concurrent use of same JDBC connection by multiple threads

RvPr picture RvPr · Oct 3, 2015 · Viewed 10k times · Source

I'm trying to better understand what will happen if multiple threads try to execute different sql queries, using the same JDBC connection, concurrently.

  • Will the outcome be functionally correct?

  • What are the performance implications?

  • Will thread A have to wait for thread B to be completely done with its query?

  • Or will thread A be able to send its query immediately after thread B has sent its query, after which the database will execute both queries in parallel?


I see that the Apache DBCP uses synchronization protocols to ensure that connections obtained from the pool are removed from the pool, and made unavailable, until they are closed. This seems more inconvenient than it needs to be. I'm thinking of building my own "pool" simply by creating a static list of open connections, and distributing them in a round-robin manner.

I don't mind the occasional performance degradation, and the convenience of not having to close the connection after every use seems very appealing. Is there any downside to me doing this?

Answer

RvPr picture RvPr · Oct 14, 2018

I ran the following set of tests using a AWS RDS Postgres database, and Java 11:

  1. Create a table with 11M rows, each row containing a single TEXT column, populated with a random 100-char string

  2. Pick a random 5 character string, and search for partial-matches of this string, in the above table

  3. Time how long the above query takes to return results. In my case, it takes ~23 seconds. Because there are very few results returned, we can conclude that the majority of this 23 seconds is spent waiting for the DB to run the full-table-scan, and not in sending the request/response packets

  4. Run multiple queries in parallel (with different keywords), using different connections. In my case, I see that they all complete in ~23 seconds. Ie, the queries are being efficiently parallelized

  5. Run multiple queries on parallel threads, using the same connection. I now see that the first result comes back in ~23 seconds. The second result comes back in ~46 seconds. The third in ~1 minute. etc etc. All the results are functionally correct, in that they match the specific keyword queried by that thread

To add on to what Joni mentioned earlier, his conclusion matches the behavior I'm seeing on Postgres as well. It appears that all "correctness" is preserved, but all parallelism benefits are lost, if multiple queries are sent on the same connection at the same time.