2016-11-11 7 views
0

Das folgende Problem trat auf, als ich begann, Intellij IDEA zu verwenden. In Eclipse funktioniert alles gut und der Iterator schließt sich.Iterator kann nicht einmal geschlossen werden DB-Verbindung ist geschlossen

Ich vermute, das ist ein Konfigurationsproblem. Welche Lösungen könnten Sie vorschlagen?

SiteFeatureData Klasse select-Methode Schnipsel:

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; 
    } 

Datenklasse returnContext Methode:

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

Verwenden Sie immer noch den gleichen Server? (z. B. Tomcat 7.0 ....?) Dort könnte es Unterschiede geben. Sie können dies auch mindern, indem Sie dbconn.isOpen() vor dem Schließen der Verbindung aktivieren. –

+0

Ja, ich benutze den gleichen Server. Aber in Eclipse funktioniert alles. –

+0

Das ... ich weiß es wirklich nicht :(Diese IDEs sind ziemlich magische Boxen, jede mit ihren eigenen speziellen Eigenschaften ... –

Antwort

0

Sie müssen überprüfen, ob die Verbindung geschlossen wird, bevor Sie iter.close() -Methode aufrufen.

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

Und Sie können versuchen, Ihren Iterator vor Ihrer DBConnection zu schließen. Dies sollte das Problem auch lösen.

+0

Ich habe es. Aber ich habe kein Problem mit Eclipse. Wie können Sie erklären, warum ich habe ein Problem nur mit IDEA? –

+0

Nun, das try {} catch (SQLException) {} innerhalb schließlich {} ist ziemlich gefährlich. Nach java.sql.Connection spec "Wenn die Schließen-Methode aufgerufen wird und es eine aktive Transaktion gibt, die Ergebnisse sind implementation-defined. "Daher kann ein legitimes Verhalten von dbconn.close(); wenn Sie es mit einem offenen ResultSet aufrufen, eine SQLException auslösen, die eingefangen werden würde und am Ende ein Verbindungsleck hätte. Vielleicht der Treiber Implementierung, die Sie mit Intellij IDEA verwenden, unterscheidet sich von der, die Sie mit Eclipse verwenden, und deshalb sehen Sie den Unterschied im Verhalten. –

+0

Ich benutze die gleiche Treiberimplementierung, die in context.xml.definiert ist Fabrik = "oracle.ucp.jdbc.PoolDataSourceImpl" type = "oracle.ucp.jdbc.PoolDataSource" \t \t \t \t \t connectionFactoryClassName = "oracle.jdbc.pool.OracleDataSource" –

1

An der Ablaufverfolgung kann gesehen werden, dass Sie OraRTResultSet.close() aufrufen, die eine Implementierung von java.sql.ResultSet.close() ist, nachdem Sie Connection.close() aufgerufen haben Das wird immer eine Ausnahme auslösen. Sie müssen das ResultSet vor dem Schließen der Verbindung schließen. So Flip-Leitungen

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

Ich habe es. Aber ich habe kein Problem mit Eclipse. Wie kannst du erklären, warum ich nur mit IDEA ein Problem habe? –

Verwandte Themen