[JDBC-56] Problem with find-connection when using agents with c3p0 connection pool Created: 16/May/13 Updated: 16/May/13 |
|
| Status: | Open |
| Project: | java.jdbc |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Ed O'Loughlin | Assignee: | Sean Corfield |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
OS X 10.8.3 |
||
| Description |
|
I use an agent to offload email processing and update a db on completion. If I use a c3p0 connection pool, I get an exception and a complaint that the connection isn't open (see stacktrace). The code works if I wrap the agent fn in a clojure.java.jdbc/with-connection and get a connection from the pool in the agent thread. The in jdbc.clj, the find-connection (db-find-connection in HEAD) checks for an existing connection and tries to use it without checking if it's open. This causes an exception with a c3p0 connection that was acquired in another thread. Here's the stacktrace I'm seeing (note the "You can't operate on a closed Connection!!!"): 2013-05-16 10:32:22,208 [clojure-agent-send-off-pool-7] DEBUG com.mchange.v2.sql.SqlUtils - Converting Throwable to SQLException... java.lang.NullPointerException at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:186) at clojure.java.jdbc$prepare_statement.doInvoke(jdbc.clj:450) at clojure.lang.RestFn.invoke(RestFn.java:425) at clojure.lang.AFn.applyToHelper(AFn.java:163) at clojure.lang.RestFn.applyTo(RestFn.java:132) at clojure.core$apply.invoke(core.clj:621) at clojure.java.jdbc$with_query_results_STAR_.invoke(jdbc.clj:646) at clj_record.core$find_by_sql$func__3362__auto____3378.invoke(core.clj:72) at clj_record.core$find_by_sql.invoke(core.clj:71) at clj_record.core$find_records.invoke(core.clj:85) at clj_record.core$find_record.invoke(core.clj:91) at neataudio.domain.interview_participant_relationship$find_record.invoke(interview_participant_relationship.clj:18) at neataudio.domain.interview_participant_relationship$update_email_status.invoke(interview_participant_relationship.clj:37) at neataudio.controllers.participant_controller$notify$fn__5113$fn__5114$func__3362__auto____5115$fn__5116.invoke(participant_controller.clj:104) at clojure.java.jdbc$transaction_STAR_$fn__3162.invoke(jdbc.clj:372) at clojure.java.jdbc$transaction_STAR_.invoke(jdbc.clj:371) at neataudio.controllers.participant_controller$notify$fn__5113$fn__5114$func__3362__auto____5115.invoke(participant_controller.clj:101) at neataudio.controllers.participant_controller$notify$fn__5113$fn__5114.invoke(participant_controller.clj:101) at neataudio.controllers.participant_controller$notify$fn__5113.invoke(participant_controller.clj:101) at clojure.lang.AFn.applyToHelper(AFn.java:185) at clojure.lang.AFn.applyTo(AFn.java:151) at clojure.core$apply.invoke(core.clj:623) at clojure.core$binding_conveyor_fn$fn__4115.doInvoke(core.clj:1848) at clojure.lang.RestFn.applyTo(RestFn.java:146) at clojure.lang.Agent$Action.doRun(Agent.java:114) at clojure.lang.Agent$Action.run(Agent.java:163) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:680) java.sql.SQLException: You can't operate on a closed Connection!!! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65) at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:222) at clojure.java.jdbc$prepare_statement.doInvoke(jdbc.clj:450) at clojure.lang.RestFn.invoke(RestFn.java:425) at clojure.lang.AFn.applyToHelper(AFn.java:163) at clojure.lang.RestFn.applyTo(RestFn.java:132) at clojure.core$apply.invoke(core.clj:621) at clojure.java.jdbc$with_query_results_STAR_.invoke(jdbc.clj:646) at clj_record.core$find_by_sql$func__3362__auto____3378.invoke(core.clj:72) at clj_record.core$find_by_sql.invoke(core.clj:71) at clj_record.core$find_records.invoke(core.clj:85) at clj_record.core$find_record.invoke(core.clj:91) at neataudio.domain.interview_participant_relationship$find_record.invoke(interview_participant_relationship.clj:18) at neataudio.domain.interview_participant_relationship$update_email_status.invoke(interview_participant_relationship.clj:37) at neataudio.controllers.participant_controller$notify$fn__5113$fn__5114$func__3362__auto____5115$fn__5116.invoke(participant_controller.clj:104) at clojure.java.jdbc$transaction_STAR_$fn__3162.invoke(jdbc.clj:372) at clojure.java.jdbc$transaction_STAR_.invoke(jdbc.clj:371) at neataudio.controllers.participant_controller$notify$fn__5113$fn__5114$func__3362__auto____5115.invoke(participant_controller.clj:101) at neataudio.controllers.participant_controller$notify$fn__5113$fn__5114.invoke(participant_controller.clj:101) at neataudio.controllers.participant_controller$notify$fn__5113.invoke(participant_controller.clj:101) at clojure.lang.AFn.applyToHelper(AFn.java:185) at clojure.lang.AFn.applyTo(AFn.java:151) at clojure.core$apply.invoke(core.clj:623) at clojure.core$binding_conveyor_fn$fn__4115.doInvoke(core.clj:1848) at clojure.lang.RestFn.applyTo(RestFn.java:146) at clojure.lang.Agent$Action.doRun(Agent.java:114) at clojure.lang.Agent$Action.run(Agent.java:163) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:680) Caused by: java.lang.NullPointerException at com.mchange.v2.c3p0.impl.NewProxyConnection.prepareStatement(NewProxyConnection.java:186) ... 28 more |
| Comments |
| Comment by Ed O'Loughlin [ 16/May/13 4:50 AM ] |
|
Apologies: this is a crappy bug report. I'm under a bit of pressure at the moment so I can't make a test case. |
[JDBC-1] Provide option to return SQL generated / execution stats Created: 08/May/11 Updated: 08/May/11 |
|
| Status: | Open |
| Project: | java.jdbc |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Sean Corfield | Assignee: | Sean Corfield |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Shantanu: Provide a mechanism to show the SQL being executed (configurable, so that it can be turned off) Sean: Good idea. Even better, a way to access statistics about the prepared statement after execution - timing etc? Shantanu: Yes, that would be an add-on value to show how are the queries performing. |