Frage

Wir laufen eine WebSphere Commerce-Website mit einer Oracle-DB und eine Frage, die sich in dem wir aus DB-Verbindungen ausgeführt werden. Wir sind mit einem JDBCHelper Singletons für das Erhalten der vorbereiteten Anweisungen und cosing die Verbindungen.

public static JDBCHelper getJDBCHelper() {

                if (theObject == null){                 
                    theObject = new JDBCHelper();
                }

        return theObject;
}
public void closeResources(Connection con, PreparedStatement pstmt, ResultSet rs){

        try{
            if(rs!=null){ rs.close();}
        }catch(SQLException e){
            logger.info("Exception closing the resultset");
        }try{
            if(pstmt!=null) { pstmt.close(); }
        }catch(SQLException e){
            logger.info("Exception closing the preparedstatement");
        }try{
            if(con!=null){ con.close(); }

        }catch(SQLException e){
            logger.info("Exception closing the connection");
        }
}

Allerdings, wenn wir versuchen, immer die Verbindung eines prepStmt.getConnection () verwendet für die enge Ressourcen vorbei nach der Ausführung es eine SQL-Ausnahme auslöst. Jede Idee, warum? Bekommt die Verbindung sofort nach der Ausführung geschlossen? Und es ist etwas falsch in unserem Gebrauch des Singletons JDBCHelper?

EDIT

Ein Teil des Codes, der die vorbereitete Anweisung macht, führt und schließt die Verbindung

PreparedStatement pstmt = jdbcHelper.getPreparedStatement(query);
try{
//rest of the code
int brs = pstmt.executeUpdate();
}

finally{
             try {
                jdbcHelper.closeResources(pstmt.getConnection(),pstmt);
            } catch (SQLException e1) {
                logger.logp(Level.SEVERE,CLASS_NAME,methodName,"In the finally block - Could not close connection", e1);
            }
        }
War es hilfreich?

Lösung

Ihre Verbindung wird höchstwahrscheinlich aus einem Pool kommen, und schließt es tatsächlich die Verbindung zum Pool (unter der Decke) zurückzukehren. Ich denke, den Code zu veröffentlichen, die die Verbindung bekommt, verwendet es und schließt es über JDBCHelper wird von mehr Nutzen sein.

Re. Ihre Singleton, ich bin nicht sicher, warum Sie diese verwenden, da es nichts zu haben scheint warrant es ein Singleton sein. Schauen Sie sich Apache Commons DbUtils , die diese Art von Sachen tut und mehr.

Andere Tipps

Dieser Code scheint nur für Single-Threaded-Betrieb geschrieben werden, da es keinen Synchronisationscode ist fehlt. Die getJdbcHelper() Methode zum Beispiel ist wahrscheinlich zwei JdbcHelpers erstellen. Wenn mich nicht alles täuscht, es gibt noch keine Garantie, dass ein zweiter Thread theObject sehen, lange nach einer primären Thread es geschaffen hat. Obwohl sie wird in der Regel, aufgrund der Architektur läuft die JVM auf.

Wenn Sie diese in einem Web-Server laufen Sie wahrscheinlich läuft in Rennen Probleme sein, wo zwei Threads Ihre Verbindung zur gleichen Zeit zu ändern. Es sei denn, Sie gerollt Ihre eigene Verbindung Pool oder so etwas.

Brian richtig ist, verwenden Sie eine der frei verfügbaren Bibliotheken, die dieses (hart) Problem für Sie zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top