在Eclipse中,我遇到了这个错误:*错误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) {
}
}
}
您正在(或曾经)将rs
和ps
设置为null,即当rc.getInt(1)==0
时。这意味着当您到达最终块时,这些测试将失败,并且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{
...
在(正确地)关闭语句和结果集之后,还需要关闭最后块中的连接。
您还需要查看cnnOracle.fermerConnexion()正在做什么。您可以调用cnnOracle.getConnexion()
两次,对于每个准备好的语句都调用一次。如果这些返回不同的连接,并且fermerConnexion()
只关闭一个,那么您也在泄漏。您需要调查每个连接内部发生了什么。
使用一个连接会更正常,因此您有一个名为sayconn
的变量,可以用cnnOracle设置。getConnexion()
,然后将准备好的语句创建为ps=conn.prepareStatement(…)
。
您目前似乎正在获取连接,并在循环中重新创建和销毁准备好的语句。在循环之前获取连接并准备好语句一次,然后在循环中执行它们会更有效率。然后在循环完成后关闭准备好的语句和连接(仍然在异常处理程序中,因为它返回给调用方,并且try块的最后一个块将不再关闭它们)。
"我不知道为什么我得到了这个错误"
可能是这个打字错误吗?
if (ps2 != null)
try {
ps.close();
} catch (Exception exx) {
}
您正在关闭ps
而不是ps2
我得到一个ORA-01000 SQL异常。所以我有一些与之相关的疑问。 编辑1:6。使用弱/软引用语句对象是否有助于防止泄漏? 编辑2:1。有没有办法,我可以找到我的项目中所有缺失的“statement.close()”?我知道这不是内存泄漏。但是我需要找到一个符合垃圾收集条件的语句引用(在那里没有执行close())?有工具吗?还是我必须手动分析? 请帮我理解一下。
问题内容: 我收到了ORA-01000 SQL异常。因此,我对此有一些疑问。 最大打开游标是否与JDBC连接的数量完全相关,还是与我们为单个连接创建的语句和结果集对象相关?(我们正在使用连接池) 有没有一种方法可以配置数据库中的语句/结果集对象的数量(如连接)? 是否建议在单线程环境中使用实例变量statement / resultset对象而不是方法local statement / resul
我已经连接了Oracle数据库。现在我要面对 我使用代码插入数据: 它只适用于前500条记录,然后我有错误Ora-1000。我总共有大约6000条记录。我发现一些主题说应该改变配置,但我不能改变配置。 有没有其他方法可以解决这个错误?
我得到了ORA-0300:超出了最大打开游标数
我们的应用程序连接到Oracle数据库,我们使用Spring提供的JDBCTemboard与数据库交互。根据Spring JDBCTemboard的留档,它确保它将关闭所有连接和游标。但显然我们得到了以下打开游标的异常。 ORA-01000:组织上超过了最大打开游标数。springframework。jdbc。支持AbstractFallbackSQLExceptionTranslator。在or
早上好,我正在开发一个React应用程序,通过REST API与后端通信。 该应用程序体系结构还使用 React 路由器,并使用服务器提供并存储在中的 JWT 令牌实现身份验证功能。 基本上: 用户连接到应用程序 如果用户未登录,则重定向到登录页面 登录后,它会重定向到带有路径的主页,其中应该显示带有路径的组件和带有路径的组件(如果一个很好地理解React路由器的工作) 在启动应用程序时,用户被正