It's really a bad idea to do that kind of thing in a finalize method when dealing with a valuable time-critical resource like a DB connection. - You don't know when the object will be collected and the finalize method will be run. You could find yourself running out of DB connections very quickly. - in fact there's no guarantee the finalize method will ever be run!
In short it's worth the effort to do a search through the code and close all db connections manually. That said it's a good idea to try and close the DB connection in your finalize method just in case you miss one. Hamish > -----Original Message----- > From: Rosdi bin Kasim [mailto:[EMAIL PROTECTED]] > Sent: Friday, February 21, 2003 9:14 AM > To: Tomcat Users List > Subject: Re: OT: Is it ok to close connection in finalize() ? > > > > Thanks guys for the input... yeah I understand that i can't > predict when the > gc will be run.. > > The reason I ask is that, I was (unfortunately) inherited > with some badly > designed code and I really dont have time to inspect it line > by line to see > whether each opened connection is closed or not.. > > So I thought of using finalize() as the quick-fix solution. :-) > > Anyway... I will use finalize() momentarily and see whether > it works... if > it does not, I will have no choice but to read and inspect > the code line by > line. *sigh* > > Regards. > Rosdi. > > > ----- Original Message ----- > From: "Mike Jackson" <[EMAIL PROTECTED]> > To: "Tomcat Users List" <[EMAIL PROTECTED]> > Sent: Friday, February 21, 2003 12:48 PM > Subject: RE: OT: Is it ok to close connection in finalize() ? > > > > I've never heard of issues with putting things in finalize(), but I > haven't > > really looked into it. However my issue is that you can't > predict how > > quickly the objects will be collected (see other post). > > > > I'm not a java expert, I just play one on tv. > > > > --mikej > > -=----- > > mike jackson > > [EMAIL PROTECTED] > > > > > -----Original Message----- > > > From: Jake Robb [mailto:[EMAIL PROTECTED]] > > > Sent: Thursday, February 20, 2003 8:36 PM > > > To: Tomcat Users List > > > Subject: Re: OT: Is it ok to close connection in finalize() ? > > > > > > > > > And now all these other guys say that using finalize() is > bad practice. > I > > > have to ask... Is it bad practice just for the reasons > Mike Jackson > > > described, or does the use of finalize() in general actually > > > cause problems > > > with the JVM? I've not heard that before. The 1.4 API makes no > > > mention of > > > any issues. > > > > > > Details on issues with finalize() would be appreciated, if that is > indeed > > > the case. > > > > > > -Jake > > > > > > > > > Jake Robb wrote: > > > > > > > I apologize for not being familiar with this, but I > have some insight > to > > > > offer. Bear with me: > > > > > > > > Is ConnCache your own class (i.e., did you write it)? If it > > > is, I'd put a > > > > call to close() in the finalize method of that ConnCache, not > > > GeneralConn. > > > > If it's not, I would expect that has already been done. > > > > > > > > If ConnCache not your class, and it does not close its own > > > connection, then > > > > yes, you're doing it right. There shouldn't be any > issues with that > > > > approach. > > > > > > > > finalize() is indeed guaranteed to run upon garbage > collection, which > in > > > > turn is guaranteed to happen. However, garbage collection can > > > happen at any > > > > time, so the connection may not be closed immediately. If this > > > is an issue > > > > for you, you can call System.gc() to force it to garbage collect > > > > immediately. > > > > > > > > -Jake > > > > > > > > > > > > > > > > Rosdi bin Kasim wrote: > > > > > > > >> This is a bit off topic. > > > >> > > > >> I am using connection pooling, and in my code, I open all the > > > connection I > > > >> need in an object constructor. > > > >> Then I will close this connection in finalize(), which > > > (according to what I > > > >> read) will be executed during java garbage collect. > > > >> > > > >> --- sample code ------ > > > >> > > > >> public class GeneralConn { > > > >> > > > >> private ConnCache connCache; > > > >> > > > >> //open connection during object creation > > > >> public GeneralConn () { > > > >> try { > > > >> connCache = ConnCache.getInstance(); > > > >> dbConn = connCache.getConnection(); //grab a > > > connection from > > > >> the connection pool > > > >> }catch (Exception e) { > > > >> System.out.println("Fail to open connection: " + > > > >> e.getMessage()); > > > >> } > > > >> } > > > >> > > > >> //close when this object is destroyed > > > >> public void finalize () { > > > >> try{ > > > >> dbConn.close(); > > > >> dbConn = null; > > > >> }catch (Exception e) { > > > >> System.out.println("Fail to close connection: " + > > > >> e.getMessage()); > > > >> } > > > >> } > > > >> } > > > >> > > > >> Would this be okay? is it guaranteed that finalize() will be > > > executed during > > > >> garbage collect?? > > > >> > > > >> > > > >> Regards, > > > >> Rosdi bin Kasim. > > > >> > > > >> > > > >> > > > >> > > > >> > --------------------------------------------------------------------- > > > >> To unsubscribe, e-mail: > [EMAIL PROTECTED] > > > >> For additional commands, e-mail: > [EMAIL PROTECTED] > > > >> > > > > > > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: > [EMAIL PROTECTED] > > > > For additional commands, e-mail: > [EMAIL PROTECTED] > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: > [EMAIL PROTECTED] > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
