Hi acefael,
I guess there could be concurrency problems with SQL and chaching,
because Findbugs also generates some warnings:
IS Inconsistent synchronization of groovy.sql.Sql.cacheConnection;
locked 84% of time
Bug type IS2_INCONSISTENT_SYNC (click for details)
<http://ci.groovy-lang.org/repository/download/Groovy_CoverageIndyRuntime/29803:id/subprojects/groovy-sql/target/reports/findbugs/main.html#IS2_INCONSISTENT_SYNC>
In class groovy.sql.Sql
Field groovy.sql.Sql.cacheConnection
Synchronized 84% of the time
Unsynchronized access at Sql.java:[line 4160]
Unsynchronized access at Sql.java:[line 4181]
Unsynchronized access at Sql.java:[line 4245]
Synchronized access at Sql.java:[line 3516]
Synchronized access at Sql.java:[line 3517]
Synchronized access at Sql.java:[line 3547]
Synchronized access at Sql.java:[line 3549]
Synchronized access at Sql.java:[line 3550]
Synchronized access at Sql.java:[line 3547]
Synchronized access at Sql.java:[line 3549]
Synchronized access at Sql.java:[line 3550]
Synchronized access at Sql.java:[line 3491]
Synchronized access at Sql.java:[line 3492]
Synchronized access at Sql.java:[line 3498]
Synchronized access at Sql.java:[line 3500]
Synchronized access at Sql.java:[line 3498]
Synchronized access at Sql.java:[line 3501]
Synchronized access at Sql.java:[line 3500]
Synchronized access at Sql.java:[line 3501]
IS Inconsistent synchronization of groovy.sql.Sql.cacheStatements;
locked 53% of time
Bug type IS2_INCONSISTENT_SYNC (click for details)
<http://ci.groovy-lang.org/repository/download/Groovy_CoverageIndyRuntime/29803:id/subprojects/groovy-sql/target/reports/findbugs/main.html#IS2_INCONSISTENT_SYNC>
In class groovy.sql.Sql
Field groovy.sql.Sql.cacheStatements
Synchronized 53% of the time
Unsynchronized access at Sql.java:[line 3479]
Unsynchronized access at Sql.java:[line 4160]
Unsynchronized access at Sql.java:[line 4181]
Unsynchronized access at Sql.java:[line 4228]
Unsynchronized access at Sql.java:[line 4338]
Unsynchronized access at Sql.java:[line 4216]
Synchronized access at Sql.java:[line 3469]
Synchronized access at Sql.java:[line 3835]
Synchronized access at Sql.java:[line 3836]
Synchronized access at Sql.java:[line 3842]
Synchronized access at Sql.java:[line 3844]
Synchronized access at Sql.java:[line 3842]
Synchronized access at Sql.java:[line 3844]
I do not know if they are related to your problem.
-Pascal
Am 13.11.2015 um 11:44 schrieb acefael:
hi Guillaume, hi Everyone,
first: thanks for making Groovy! It simply is great!
I am using groovy.sql.Sql with a commons dbcp2 BasicDataSource and am
encountering a stacktrace as in [2] below. I do create many identical closures
with different data, and I pass them all at once to ExecutorService.invokeAll.
The closures are all using the same Sql instance.
I believe this is a race condition because it happens only when the database is
over a network, and not when the database is local.
To work around I can set Sql.cacheNamedQueries = false. Problem is reliably
gone in this case. So I guess the culprit is in [1], with my sql already being
cached in namedParamSqlCache, but not yet in namedParamIndexPropCache?
Yours,
acefael
[1] the line in the source code
https://github.com/apache/incubator-groovy/blob/GROOVY_2_4_X/subprojects/groovy-sql/src/main/java/groovy/sql/Sql.java#L4407
[2] the stacktrace
java.lang.NullPointerException
at java.util.ArrayList.<init>(ArrayList.java:168) ~[?:1.8.0]
at groovy.sql.Sql.buildSqlWithIndexedProps(Sql.java:4422)
~[groovy-all-2.4.5.jar:2.4.5]
at groovy.sql.Sql.checkForNamedParams(Sql.java:4369)
~[groovy-all-2.4.5.jar:2.4.5]
at groovy.sql.Sql.getPreparedStatement(Sql.java:4360)
~[groovy-all-2.4.5.jar:2.4.5]
at groovy.sql.Sql.getPreparedStatement(Sql.java:4439)
~[groovy-all-2.4.5.jar:2.4.5]
at groovy.sql.Sql.execute(Sql.java:2366) ~[groovy-all-2.4.5.jar:2.4.5]
at groovy.sql.Sql.execute(Sql.java:2438) ~[groovy-all-2.4.5.jar:2.4.5]
at groovy.sql.Sql$execute$1.call(Unknown Source) ~[?:?]
at es.acefael.BaseMigration.execute(BaseMigration.groovy:2017)
~[es-acefael-dostuff-SNAPSHOT.jar:?]