oracle JDBC PreparedStatement 内存释放BUG?
我用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;
}
}
当用 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;
}
}
...全文
相关推荐
如何避免JDBC引起的内存溢出情况
有的时候,我们需要一次查询很多的数据,或者是说每次查询的数据量都很大,都有可能早晨内存溢出的情况,所以我们今天分别针对三个数据库来探讨如何避免这一问题。
centos服务器搭建环境的解决方案
本文主要介绍了centos服务器搭建环境的解决方案,希望能对学习linux的同学有所帮助。 文章目录 1. centos配置阿里云yum源(类似更改为清华镜像源) 2. 安装python3 2.1 yum准备 2.2 安装python3 3. 安装lspci 4. 安装Anaconda
CentOS 下 DNS 服务器搭建与管理
本文旨在为需要在CentOS系统上部署DNS服务的系统管理员和网络工程师提供全面的技术指导。内容涵盖从基础DNS概念到高级配置技巧的全方位知识,特别关注企业级环境中的实际应用场景。本文首先介绍DNS基础概念,然后详细讲解BIND软件的安装与配置,接着探讨DNS安全和管理的最佳实践,最后提供实际案例和故障排查指南。DNS:域名系统(Domain Name System),用于将域名转换为IP地址的分布式数据库系统BIND。
oracle所有版本jdbc的jar包
oracle所有版本jdbc的jar包,除了oracle8i,最新版本是oracle18c
JDBC驱动包(oracle和mysql)
里面包括JDBC与mysql的驱动包和oracle的驱动包,我一直在用的


Java SE
