有关JDBC中PreparedStatement的问题
部分代码如下:PreparedStatementps=null;try{...for(inti=0;i<100;i++){ps=conn.getPrepareStatem...
部分代码如下:
PreparedStatement ps = null;
try
{
...
for(int i=0;i<100;i++){
ps = conn.getPrepareStatement("sql语句");
}
...
}catch(SQLException se ){
}
finally{
ps.close();
conn.close();
}
>>问题1:
我做了100次循环,但是只在最后关闭了一个PreparedStatement对象
请问,我用不同的sql语句生成的ps对象是否是同一个?
如果不是一个对象那我就还有99个PreparedStatement对象未关闭?
>>问题2:
可不可以在生成PreparedStatement对象时不附加sql语句,然后用ps点出一个方法然后再附加slq语句?
如果问题二是可行的那说明问题一中的PreparedStatement对象均为一个对象?
谢谢各位!!!!
TO glassesbamboo - 助理 二级 & TO ihymge - 试用期 一级
二位,你们的看法正好相反你。。
一个说是100个对象,另一个说是1一个对象。。到底哪一个是对的?
TO sphenic - 试用期 一级
请问,你为什么说关闭与不关闭都没有关系呢?
TO cyngenius - 经理 五级
"GC能自动回收的只是JAVA创建的资源",请问,你这句话要怎么理解?任何资源都是
java创建的,难道有不是java程序创建的资源吗?
你说所得内存泄漏应该是“内存溢出”吧?
======================================================
TO cyngenius - 经理 五级
你好,你的意思是由jdbc创建的属于数据库那一部分的资源无法自行关闭,比如会话,线程,等等。。。
只有通过close方法才能关闭是吗? 展开
PreparedStatement ps = null;
try
{
...
for(int i=0;i<100;i++){
ps = conn.getPrepareStatement("sql语句");
}
...
}catch(SQLException se ){
}
finally{
ps.close();
conn.close();
}
>>问题1:
我做了100次循环,但是只在最后关闭了一个PreparedStatement对象
请问,我用不同的sql语句生成的ps对象是否是同一个?
如果不是一个对象那我就还有99个PreparedStatement对象未关闭?
>>问题2:
可不可以在生成PreparedStatement对象时不附加sql语句,然后用ps点出一个方法然后再附加slq语句?
如果问题二是可行的那说明问题一中的PreparedStatement对象均为一个对象?
谢谢各位!!!!
TO glassesbamboo - 助理 二级 & TO ihymge - 试用期 一级
二位,你们的看法正好相反你。。
一个说是100个对象,另一个说是1一个对象。。到底哪一个是对的?
TO sphenic - 试用期 一级
请问,你为什么说关闭与不关闭都没有关系呢?
TO cyngenius - 经理 五级
"GC能自动回收的只是JAVA创建的资源",请问,你这句话要怎么理解?任何资源都是
java创建的,难道有不是java程序创建的资源吗?
你说所得内存泄漏应该是“内存溢出”吧?
======================================================
TO cyngenius - 经理 五级
你好,你的意思是由jdbc创建的属于数据库那一部分的资源无法自行关闭,比如会话,线程,等等。。。
只有通过close方法才能关闭是吗? 展开
4个回答
展开全部
1.你创建了100个PS的实例,但是你只关闭了最后一个。1楼说的GC会回收另外99个,没错,但GC能自动回收的只是JAVA创建的资源。
preparedstatement为jdbc得api,他还会创建跟具体数据库有关的其他资源。close方法就是用来施放那些资源的。如果你没有每个都close,会导致内存泄漏。
2.不可以。
------------
补充:当然有非java创建的资源 jdbc可以说是一个和数据库通信的驱动。你建立jdbc的对象,调用它的方法。jdbc会去调用你使用的数据库的api,实现对数据库的操作。那些数据库的api会创建很多资源。java的gc(垃圾回收器)只会释放掉那些java对象所占的内存。无法释放数据库api创建的资源。只有通过jdbc相关的close方法才能释放。
你只要记住,所有有close方法的jdbc对象在使用完成后都需要手动释放。
另外,就是内存泄漏,相应的资源在内存中没有被引用,而又没有被操作系统回收。
对,就是这个意思,除了JDBC还有很多根操作系统api有关的java api都有close方法,他们都是用来释放相应的非java资源的。
preparedstatement为jdbc得api,他还会创建跟具体数据库有关的其他资源。close方法就是用来施放那些资源的。如果你没有每个都close,会导致内存泄漏。
2.不可以。
------------
补充:当然有非java创建的资源 jdbc可以说是一个和数据库通信的驱动。你建立jdbc的对象,调用它的方法。jdbc会去调用你使用的数据库的api,实现对数据库的操作。那些数据库的api会创建很多资源。java的gc(垃圾回收器)只会释放掉那些java对象所占的内存。无法释放数据库api创建的资源。只有通过jdbc相关的close方法才能释放。
你只要记住,所有有close方法的jdbc对象在使用完成后都需要手动释放。
另外,就是内存泄漏,相应的资源在内存中没有被引用,而又没有被操作系统回收。
对,就是这个意思,除了JDBC还有很多根操作系统api有关的java api都有close方法,他们都是用来释放相应的非java资源的。
亚远景信息科技
2024-12-11 广告
2024-12-11 广告
上海亚远景信息科技有限公司是国内汽车行业咨询及评估领军机构之一,深耕于ASPICE、敏捷SPICE、ISO26262功能安全、ISO21434车辆网络安全领域,拥有20年以上的行业经验,专精于培训、咨询及评估服务,广受全球车厂及供应商赞誉,...
点击进入详情页
本回答由亚远景信息科技提供
展开全部
>>问题1:
我做了100次循环,但是只在最后关闭了一个PreparedStatement对象
请问,我用不同的sql语句生成的ps对象是否是同一个?
如果不是一个对象那我就还有99个PreparedStatement对象未关闭?
不是同一个,但关不关闭都没问题。
>>问题2:
可不可以在生成PreparedStatement对象时不附加sql语句,然后用ps点出一个方法然后再附加slq语句?
没有这个METHOD,只能使用Statement才可以。
我做了100次循环,但是只在最后关闭了一个PreparedStatement对象
请问,我用不同的sql语句生成的ps对象是否是同一个?
如果不是一个对象那我就还有99个PreparedStatement对象未关闭?
不是同一个,但关不关闭都没问题。
>>问题2:
可不可以在生成PreparedStatement对象时不附加sql语句,然后用ps点出一个方法然后再附加slq语句?
没有这个METHOD,只能使用Statement才可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.的确是初始化了100个实例,但是你最终引用的是最后1个,所以GC会在适当的时候对另外99个垃圾回收。
2.不可以。
2.不可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1:同一个对象.
2:没试过.应该不行.你可以改往ps类里面添加方法?我没试过.
2:没试过.应该不行.你可以改往ps类里面添加方法?我没试过.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询