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;
}
PreparedStatementinstances are tied to the connection used to prepare them, as far as I’m aware. You can’t use thePreparedStatementafter closing the connection, even if you open another one later.