我正在使用groovy.sql.Sql对Oracle执行查询并返回一个ResultSet,然后在自定义TableAdapter中使用它来支持JTable。查询执行时没有错误,但是当我尝试从ResultSet中检索MetaData时,在< init>期间抛出NullPointerException。第72行的OracleResultSetMetaData方法。我无法找到该类的源代码以找出可能为null的内容,所以我转向这个很棒的社区寻求帮助。
下面的函数是我用来执行我的SQL查询的,该查询是在一个解析模板的单独类中生成的。我目前正在模拟模板以返回经过验证的有效SQL语句。
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
}
我的getColumnCount方法是NPE发生的地方,看起来像这样。
@Override
public synchronized int getColumnCount() {
return getResultSet().metaData.columnCount
}
这是我的堆栈跟踪以获得良好的衡量标准。
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)
更新:我修改了我的代码以从模板而不是ResultSetMetaData对象中提取信息,现在我收到一个错误,我的ResultSet已关闭。我认为假设这是导致OracleResultSetMetaData对象在其&lt; init&gt;期间失败的原因是相对安全的。方法。谁能看到我做错了什么?
答案 0 :(得分:0)
经过一些研究,我发现ResultSet被关闭的原因是正在关闭在groovy.sql.Sql.executeQuery()函数引擎下创建的Statement对象。为了防止它被关闭,我只需要在我的groovy.sql.Sql对象上启用语句缓存。
sql.cacheStatements = true