简体   繁体   中英

2nd time calling PreparedStatement is not working after closing connection

I'm trying to execute 2nd time PreparedStatement , but it fails if I close DriverManager.getConnection

the code:

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

So first time it works just fine, but when I try call this method twice it shows error :(

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

error stack

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

if I DO not close connection everything works..

Thank you!

UPD: source of 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;
}

PreparedStatement instances are tied to the connection used to prepare them, as far as I'm aware. You can't use the PreparedStatement after closing the connection, even if you open another one later.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM