0

私は groovy.sql.Sql を使用して Oracle に対してクエリを実行し、カスタム TableAdapter で JTable をサポートするために使用される ResultSet を返します。クエリはエラーなしで実行されますが、ResultSet から MetaData を取得しようとすると、72 行目の OracleResultSetMetaData の <init> メソッドで NullPointerException がスローされます。 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 オブジェクトが <init> メソッド中に失敗する原因であると想定するのは比較的安全だと思います。誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

0

いくつかの調査の結果、ResultSet が閉じられている理由は、groovy.sql.Sql.executeQuery() 関数の内部で作成されている Statement オブジェクトが閉じられているためであることがわかりました。閉じられないようにするために、groovy.sql.Sql オブジェクトでステートメント キャッシュを有効にする必要がありました。

sql.cacheStatements = true
于 2012-10-21T05:19:08.767 に答える