我正在尝试执行第二次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;
}
答案 0 :(得分:3)
PreparedStatement
个实例与用于准备它们的连接相关联。关闭连接后,即使您稍后再打开另一个连接,也无法使用PreparedStatement
。