oracle JDBC PreparedStatement 内存释放BUG?
fita 2004-06-23 05:28:27 我用oracle 9.2 的OCI JDBC驱动以及oracle9.2客户端,访问 oracle 8i 数据库服务器,发现一个问题:
当用 conn.prepareStatement语句prepare好一个PreparedStatement后,如果执行过execute,再调用close,则相应的内存就会被释放,如果没有调用PreparedStatement的execute语句,就调用close把它关掉的话,这个语句占用的内存将不会释放,导致内存泄漏。
大家碰到过这个问题吗?这是Oracle的BUG吗?有没有好的解决办法?
下面的代码不会产生内存泄漏
Connection conn;
……
PreparedStatement stat = null;
ResultSet rs = null;
try
{
stat = conn.preparedStatement("SELECT * FROM TABLE1 WHERE F1=?");
stat.setString(1,"1");
rs = stat.executeQuery();
……
}
catch (SQLException e)
{
}
finally
{
if (rs!=null)
{
try
{
rs.close();
}
catch (SQLException e1)
{
}
rs = null;
}
if (stat!=null)
{
try
{
stat.close();
}
catch (SQLException e1)
{
}
stat = null;
}
}
而下面的代码会有内存泄漏,泄漏的内存调用 GC 也释放不掉
Connection conn;
……
PreparedStatement stat = null;
ResultSet rs = null;
try
{
stat = conn.preparedStatement("SELECT * FROM TABLE1 WHERE F1=?");
//不执行任何操作
}
catch (SQLException e)
{
}
finally
{
if (rs!=null)
{
try
{
rs.close();
}
catch (SQLException e1)
{
}
rs = null;
}
if (stat!=null)
{
try
{
stat.close();
}
catch (SQLException e1)
{
}
stat = null;
}
}