在Eclipse中,我得到了这个错误:**Error ORA-01000:超出了最大打开游标--我终于关闭了块中的连接,但是我不知道为什么会出现这个错误,下面是我的代码JAVA。请帮帮我!
for (DossierAMO dos = null; it.hasNext();) {
PreparedStatement ps = null;
ResultSet rs = null;
PreparedStatement ps2 = null;
ResultSet rs2 = null;
try {
dos = (DossierAMO) it.next();
//PreparedStatement ps = null;
//ResultSet rs = null;
/*try
*
{*/
System.out.println("Imma"+dos.getImma());
ps = cnnOracle.getConnexion().prepareStatement(
"select count(IMM_IMM_V_NUM_IMM) from d_salaire@prod_dist where SAL_C_DS =21 and IMM_IMM_V_NUM_IMM =?",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY
);
ps.setString(1,dos.getImma());
rs = ps.executeQuery();
if (rs.next()){
if (rs.getInt(1) != 0)
//System.out.println("> Ecriture des dossiers d'indus dans le fichier d'indus2");
fichierIndius2.ecrireDossier(dos);
else
{
ps2 = cnnOracle.getConnexion().prepareStatement(
"select count(DOS_N_NUM_DOS) from d_dossier@prod_dist where IMM_IMM_V_NUM_IMM =?",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY
);
ps2.setString(1,dos.getImma());
rs2 = ps2.executeQuery();
if (rs2.next()){
if (rs2.getInt(1) != 0)
fichierIndius2.ecrireDossier(dos);
else{
fichierIndius.ecrireDossier(dos);
}}}}
} catch (Exception ex) {
requete.fermer();
fichierIndius.fermerSansException();
fichierIndius2.fermerSansException();
cnnAS400.fermerConnexion();
cnnAS400FO.fermerConnexion();
cnnOracle.fermerConnexion();
System.err
.println("Erreur d'écriture dans le fichier d'indus! / EXC : "
+ ex);
return;
}
finally{
if (rs != null)
try {
rs.close();
} catch (Exception exx) {
}
if (rs2 != null)
try {
rs2.close();
} catch (Exception exx) {
}
if (ps != null)
try {
ps.close();
} catch (Exception exx) {
}
if (ps2 != null)
try {
ps2.close();
} catch (Exception exx) {
}
}
}发布于 2017-02-24 15:34:04
您正在(或曾经)将rs和ps设置为空在else中,即当rc.getInt(1) == 0。这意味着,当您到达finally块时,这些测试将失败,并且ps和rs无法关闭:
if (rs != null)
try {
rs.close();
} catch (Exception exx) {
}
....
if (ps != null)
try {
ps.close();
} catch (Exception exx) {
}正如@APC已经指出的那样,您也(或曾经)在这里结束了错误的声明:
if (ps2 != null)
try {
ps.close();
} catch (Exception exx) {
}更大的问题是你没有像你声称的那样释放你的连接。有一个对cnnOracle.fermerConnexion()的调用,但仅在异常处理程序中:
...
} catch (Exception ex) {
requete.fermer();
fichierIndius.fermerSansException();
fichierIndius2.fermerSansException();
cnnAS400.fermerConnexion();
cnnAS400FO.fermerConnexion();
cnnOracle.fermerConnexion();
System.err
.println("Erreur d'écriture dans le fichier d'indus! / EXC : "
+ ex);
return;
}
finally{
...在(正确地)关闭语句和结果集之后,还需要关闭finally块中的连接。
您还需要查看cnnOracle.fermerConnexion()正在做什么。您调用cnnOracle.getConnexion()两次,每次为准备好的语句调用一次。如果这些连接返回不同的连接,而fermerConnexion()只关闭一个连接,那么您也是在泄漏连接。你需要调查每个人体内发生了什么。
使用一个连接会更正常,因此您有一个名为“conn”的变量,使用cnnOracle.getConnexion()设置该变量,然后将准备好的状态创建为ps = conn.prepareStatement(...)。
目前,您似乎正在获取连接,并在循环中重新创建和销毁准备好的语句。在循环之前一次获得连接并准备语句,然后在循环中执行它们,这将是更有效的方法。然后在循环完成后关闭准备好的语句和连接(并且仍然在异常处理程序中,因为这将返回给调用方,而try块的最后一个块将不再关闭它们)。
发布于 2017-02-24 14:38:02
“我不知道我为什么要犯这个错误”
会是这个错误吗?
if (ps2 != null)
try {
ps.close();
} catch (Exception exx) {
}你要关闭ps而不是ps2
https://stackoverflow.com/questions/42441092
复制相似问题