Второй раз вызов PreparedStatement не работает после закрытия соединения - PullRequest
0 голосов
/ 15 сентября 2011

Я пытаюсь выполнить 2-й раз PreparedStatement, но не получается, если я закрою DriverManager.getConnection

код:

public void getRates(String id) throws Exception, DBException {

        Connection conn = null;
        ResultSet rs    = null;

        try {

            conn = getConnection();

            if (ratesQueryStmt == null){
                ratesQueryStmt = conn.prepareStatement(ratesQuery); 
            }
            ratesQueryStmt.setString(1, id);

            ratesQueryStmt.setQueryTimeout(m_nTimeout);

            rs = ratesQueryStmt.executeQuery();

            while (rs.next()){
                System.out.println("!!!\n\nDATE = " + rs.getString("RATE_DAY") + " PURCHASE_PRICE = " + rs.getString("PURCHASE_PRICE") + " SELLING_PRICE = " + rs.getString("SELLING_PRICE"));
            }

        }
        catch (SQLException e) {
            Utility.trace(m_session, "SQL exception - code: "+String.valueOf(e.getErrorCode())+" "+e.getMessage());
            throw e;
        }
        finally {
            DBAccess.closeEverything(rs, ratesQueryStmt, conn); //DO NOT WORK BECAUSE OF CLOSING CONNECTION (conn)
        }

Так что в первый раз все работает просто отлично,но когда я пытаюсь вызвать этот метод дважды, он показывает ошибку: (

        DBAccess.getInstance(mySession).getRates("USD"); //WORKS
        DBAccess.getInstance(mySession).getRates("EUR"); // NOT WORKING

стек ошибок

java.lang.NullPointerException
    at oracle.jdbc.dbaccess.DBDataSetImpl._createOrGetDBItem(DBDataSetImpl.java:825)
    at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2520)
    at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1248)
    at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:1690)
    at asteros.DBAccess.getRates(DBAccess.java:141) //ratesQueryStmt.setString(1, id);

если я НЕ закрываю соединение, все работает ..

СпасибоВы!

UPD: источник getConnection ()

public Connection getConnection() throws Exception {
    Connection conn = null;
    try {

        Utility.trace(m_session, "DB string: "+m_strDBString+" user: "+m_strUser+" password: "+m_strPassword);
        System.out.println("DB string: "+m_strDBString+" user: "+m_strUser+" password: "+m_strPassword);

        Driver dr = new oracle.jdbc.driver.OracleDriver();
        DriverManager.registerDriver(dr);
        conn = DriverManager.getConnection(m_strDBString, m_strUser, m_strPassword);

    } catch (Exception e) {
        throw new Exception(e);
    }

    return conn;
}

1 Ответ

3 голосов
/ 15 сентября 2011
Насколько мне известно, экземпляры

PreparedStatement привязаны к соединению, используемому для их подготовки.Вы не можете использовать PreparedStatement после закрытия соединения, даже если позже откроете другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...