I’m using groovy.sql.Sql to execute a query against Oracle and return a ResultSet that is then used in a custom TableAdapter to back a JTable. The query executes without error, but when I try to retrieve the MetaData from the ResultSet, a NullPointerException is thrown during the <init> method of OracleResultSetMetaData on line 72. I have been unable to locate the source code for that class to find out what could possibly be null, so I’m turning to this wonderful community for help.
The function below is what I’m using to execute my SQL query which is generated in a separate class that parses a template. I’m currently mocking the template to return a verified valid SQL statement.
ResultSet getResultSet() {
if (data == null) {
if (sql == null) {
sql = Sql.newInstance(CONN_STRING, USERNAME, PASSWORD, DRIVER_NAME)
sql.resultSetType = ResultSet.TYPE_SCROLL_SENSITIVE
sql.resultSetHoldability = ResultSet.HOLD_CURSORS_OVER_COMMIT // Added since initial post
}
data = sql.executeQuery(template.getSql())
}
return data
}
My getColumnCount method is where the NPE is occuring, and it looks like this.
@Override
public synchronized int getColumnCount() {
return getResultSet().metaData.columnCount
}
Here’s my stack trace for good measure.
2012-10-20 21:49:12,135 [AWT-EventQueue-0] ERROR org.codehaus.griffon.runtime.builder.UberBuilder - An error occurred while building browser.BrowserView@17c1e333
[exec] java.lang.NullPointerException
[exec] at oracle.jdbc.driver.OracleResultSetMetaData.<init>(OracleResultSetMetaData.java:72)
[exec] at oracle.jdbc.driver.ScrollableResultSet.getMetaData(ScrollableResultSet.java:2004)
[exec] at com.trxi.browser.TemplateTableModel.getColumnCount(TemplateTableModel.groovy:75)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:97)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:141)
[exec] at browser.BrowserView$_run_closure1_closure2.doCall(BrowserView.groovy:11)
[exec] at browser.BrowserView$_run_closure1_closure2.doCall(BrowserView.groovy)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:97)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:141)
[exec] at browser.BrowserView$_run_closure1.doCall(BrowserView.groovy:10)
[exec] at browser.BrowserView$_run_closure1.doCall(BrowserView.groovy)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:97)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:168)
[exec] at browser.BrowserView.run(BrowserView.groovy:4)
[exec] at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:152)
[exec] at org.codehaus.griffon.runtime.builder.UberBuilder.build(UberBuilder.groovy:160)
[exec] at org.codehaus.griffon.runtime.core.AbstractMVCGroup$1.run(AbstractMVCGroup.java:129)
UPDATE: I modified my code to pull information from the template instead of the ResultSetMetaData object, and now I’m getting an error that my ResultSet is closed. I think it is relatively safe to assume that this is what is causing the OracleResultSetMetaData object to fail during its <init> method. Can anyone see what I’m doing wrong?
After some research, I found that the reason the ResultSet is being closed is that the Statement object being created under the hood of the groovy.sql.Sql.executeQuery() function was being closed. In order to prevent it from being closed, I just needed to enable statement caching on my groovy.sql.Sql object.