On Tue, Nov 9, 2010 at 4:10 PM, Kris Jurka
<books@ejurka.com> wrote:
On Mon, 8 Nov 2010, Michael Fork wrote:
Caused by: org.postgresql.util.PSQLException: The column name mdn was not found
in this ResultSet.
I receive the above error message when accessing the JDBC resultset from multiple threads. It does not occur consistently, but roughly every 20 or 30 runs and almost immediately upon invocation. Looking at org/postgresql/jdbc2/AbstractJdbc2ResultSet.java it appears there is a race condition around building columnNameIndexMap
I cannot confirm this, but I would guess that on thread enters, has the NULL map and creates the new HashMap. The second thread enters, sees the non-NULL columnNameIndexMap, and gets to the HashMap.get call prior to the first thread fully populating the map. If this is the problem, would wrapping the IF block in a synchronized(this) block fix it?
That looks like the correct diagnosis and fix to me.
That would only be a valid fix if ResultSet is intended to be inherently threadsafe. I wouldn't think that is the case. There is no mention of thread safety at all in the javadocs, which I would always take to imply that there is no implicit thread safety. Code which utilizes a ResultSet should do so in a thread safe manner, rather than attempting to make the resultset implementation thread-safe - unless my assumptions about the intent of the interface designers is incorrect.