2016-11-11 17 views
0

Intellij IDEAを使用し始めたとき、次の問題が発生しました。 Eclipseではすべて正常に動作し、イテレータは終了します。DB接続が終了すると、イテレーターを閉じることができません

これは構成の問題であると思います。どのような解決策を提案できますか?

SiteFeatureDataクラスselectメソッドの抜粋:

Connection dbconn = null; 
    try{ 
     dbconn = ConnCacheImpl.getConnection(); 
     ctx = Data.getContext(dbconn); 
     etx = new ExecutionContext(); 
     #sql [ctx,etx] iter = { 
      SELECT id, ... 
     }; 
    if (iter.next()) { 
      populate(iter, ... 
        , ctx.getConnection() 
        ); 
     } 
    }finally{ 
     try{ 
      dbconn.close(); 
      returnContext(ctx,etx,iter); 
     } catch(SQLException ex){}; 
     ctx = null; 
     etx = null; 
     iter = null; 
    } 

データクラスreturnContext方法:

protected static void returnContext(DefaultContext ctx 
            ,ExecutionContext etx 
            ,ResultSetIterImpl iter) throws SQLException{ 
    if(iter != null){ 
     iter.close(); // PROBLEM IS HERE 
    } 
    if(etx != null){ 
     etx.close(); 
    } 
    if(ctx != null){ 
     ctx.close(ConnectionContext.KEEP_CONNECTION); 
    } 
} 


Caused by: java.lang.reflect.UndeclaredThrowableException 
    at com.sun.proxy.$Proxy5.getStmtCacheSize(Unknown Source) 
    at sqlj.runtime.ref.OraRTResultSet.close(OraRTResultSet.java:1018) 
    at sqlj.runtime.ref.ResultSetIterImpl.close(ResultSetIterImpl.java:187) 
    at com.softdesign.persistence.Data.returnContext(Data.java:60) 
    at com.requestcom.geofire.domain.data.SiteFeatureData.select(SiteFeatureData.java:2326) 
    at com.softdesign.persistence.Persistent.exists(Persistent.java:343) 
    at com.softdesign.persistence.Persistent.exists(Persistent.java:326) 
    at com.requestcom.geofire.context.ServletRequestContext.getSiteFeature(ServletRequestContext.java:3976) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:395) 
    at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:384) 
    at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:173) 
    ... 38 more 
Caused by: java.sql.SQLException: The connection is closed: The connection is closed 
    at oracle.ucp.util.UCPErrorHandler.newSQLException(UCPErrorHandler.java:473) 
    at oracle.ucp.util.UCPErrorHandler.newSQLException(UCPErrorHandler.java:457) 
    at oracle.ucp.jdbc.proxy.JDBCConnectionProxyFactory.invoke(JDBCConnectionProxyFactory.java:255) 
    ... 53 more 
+0

まだ同じサーバーを使用していますか? (例えば、Tomcat 7.0 ....?)そこには違いがあるかもしれません。また、接続を閉じる前にdbconn.isOpen()をチェックするだけで軽減できます。 –

+0

はい、私は同じサーバーを使用しています。しかし、Eclipseではすべてが機能します。 –

+0

これは....私は本当に知りません:(これらのIDEはかなりのマジックボックスで、それぞれ独自の特別な機能を持っています... –

答えて

0

あなたはiter.close()メソッドを呼び出す前に、接続が閉じているかどうかを確認する必要があります。

if(iter != null && !iter.isClosed()){ 
    iter.close(); 
} 

DBConnectionの前にイテレータを閉じることができます。これも問題を解決するはずです。

+0

私はそれを得ましたが、Eclipseを使用しても問題はありません。 IDEAのみの問題? –

+0

最終的に{}内のtry {} catch(SQLException){}がかなり危険です。java.sql.Connection specによると、 "closeメソッドが呼び出され、アクティブなトランザクションがある場合、 dbconn.close()の正当な動作の1つは、開いているResultSetで呼び出すと、SQLExceptionがスローされて、接続リークが発生する可能性があります。 Intellij IDEAで使用しているインプリメンテーションは、Eclipseで使用しているインプリメンテーションとは異なるため、動作の違いがわかります。 –

+0

私はcontext.xmlで定義されているのと同じドライバ実装を使用します。 工場= "oracle.ucp.jdbc.PoolDataSourceImpl" タイプ= "oracle.ucp.jdbc.PoolDataSource" \t \t \t \t \t connectionFactoryClassName = "oracle.jdbc.pool.OracleConnectionCacheImplでは" あなたは同じ接続プールを使用している場合であっても –

1

Connection.close()を呼び出した後、java.sql.ResultSet.close()の実装であるOraRTResultSet.close()を呼び出していることがわかります。 これは常に例外を発生させます。 接続を閉じる前にResultSetを閉じる必要があります。 フリップライン

returnContext(ctx,etx,iter); 
dbconn.close(); 
+0

私はそれを得た。しかし、私はEclipseを使用しても問題ありません。私がIDEAだけに問題がある理由をどうして説明できますか? –

関連する問題