没有析构函数,这个功能怎么实现? 我考,是我傻,还是java傻。
我想实现
有个类有多个方法,每个方法里都用到数据库,数据库连接可以从外部传入,如果外部没有传入,我就自己创建。
如果没有外部传入数据库,因为java 没有析构函数,那我就必须显式的加一个释放数据库连接的方式。
如果这个类提供给别人使用,别人一旦忘了调用destory,数据库连接池就完蛋了。
我考,是我傻,还是java傻。
main()
{
Test test1=new Test test()
test1.f1(a,b);
test1.f2(a,b)
test1.destory();
Test test2=new Test test()
test2.setconn(dbconn)
test2.f1(a,b);
test2.f2(a,b)
test2.destory();
}
class Test
{
connection conn=null;
boolean bCreateConn=false;
f1(a,b)
{
insert a,b;
}
f2(a,b,c)
{
insert a,b,c;
}
f3(a,b,c,d)
{
if(this.conn==null)
{
createconn()
}
insert a,b,c,d
}
setconn(dbconn)
{
this.conn=dbconn;
}
createconn()
{
bCreateConn=true;
this.conn=conn.connect(....)
}
destory
{
if(bCreateConn)
{
conn.close();
}
}
}
------解决方案--------------------兄弟 是你傻吧,哪个搞java不知道 要关闭 啊。
你还真呆
------解决方案--------------------java不是有finalize() 吗???和析构函数一样的啊
------解决方案--------------------不过垃圾回收器释放该类的时候才用到finalize() ,所以你最好显示的调用一下
------解决方案--------------------我是说显示调用垃圾回收器啊
------解决方案--------------------没有,你想啊,如果用C++,你new的话还要delete,java中你不需要delete,回收器给你做,方便的同时,那么势必要丢失一些东西,其实你可以这样,你用destory方法显式调用垃圾回收器,如果他调用了destory方法就皆大欢喜,如果忘了,那么等系统自动调用垃圾回收器的时候也释放了。
但是,系统还没调用垃圾回收器,但是用户结束掉程序了,这个时候就会出问题了,数据库连接池完蛋,不过这样的几率会少很多了,其实它不调用destory方法引发的问题是他程序设计的问题,错不在你,你能做的只是尽量帮他健壮点,智能化点。
------解决方案--------------------这种情况的确存在,提供给客户使用,如果客户忘记关闭,便会导致资源泄漏,这不是语言层面可以解决的问题。
------解决方案--------------------
------解决方案--------------------学习
------解决方案--------------------路过!
------解决方案--------------------f1(a,b)
{
insert a,b;
//在这释放连接.
}
------解决方案--------------------UP
------解决方案--------------------是finalize方法。
可以在finalize方法里面,调用destory方法,完成数据库连接的释放。
一般情况下,程序开发,都要有显示释放数据库连接的代码。
这样可以使资源得到及时的管理(或回收)。
而采用finalize方法释放资源的方式,会有一个显著地特点(或者说缺陷)。
就是,finalize方法的调用时间,是不可精确确定的。
这样,你程序中的资源何时被释放,也就变得的有些飘渺。
严重情况下,会导致系统瘫痪。
------解决方案--------------------又要马儿跑,又要马儿不吃草
------解决方案--------------------应该是你傻,因为所有数据库的链接都是需要释放的,就算你使用其它语言来实现,仍旧需要释放,区别是像C++这种语言把释放链接放入到析构函数中而已,而java则放入一个方法中。
如果你设计了一个数据库访问的类,或者说你实现了一个数据库访问层,然后这个层要其它业务来调用,那你就应该实现成业务调用不用来关心数据库访问的细节,比如数据库的打开与关闭,只用关系传入什么值得到什么值就可以了,如果不是这样,说明你的数据库访问设计得有问题。例如你完全可以在每次调用数据库模块开始打开数据库,调用结束关闭数据库。其实写java程序,你只要完全的去用面向对象的思想来解决问题,这些东西都可以被封装得很好,这完全是依靠你对语言的理解以及多架构的理解了。如果你觉得每次访问都要打开或者关闭数据库很消耗系统资源,没错、的确如此,这样就是很消耗数据库以及系统资源,因此你可以实现数据库连接池,关于这点你可以参考容器jndi的jdbc链接实现,也可以参考spring对jdbc的处理,也可以参考hibernate对数据库连接的封装出来。