Hej!
Jag har läst några artiklar på nätet om try-catch-finally.
Om jag förstod rätt, så kan det hända att finally inte anropas "direkt" efter try-catch-satsen.
Jag förstod inte riktigt detta påstående eftersom ja gahr lärt mig att finally alltid exekveras direkt efter en try-catch sats.
I Java behöver man inte frigöra minne, som man har allokerat med new. Deallokering sköts ju av Garbage Collector (gc).
Dock så vet man aldrig exakt, när gc anropas. Detta är ju upp till varje JVM att bestämma.
Man kan anropa gc manuellt, om man vill.
Vad jag är ute efter:
Just nu har jag ett system som inte använder en s k Connection Pool, utan en ny connection skapas vid varje sql-förfrågan.
Systemet i sig är inte så högbelastad så för tillfället behövs inte ett Connection Pool. Dock skall jag implementera det senare.
Jag försöker ändå ha ett så centralt styrning av sql-klasserna som möjligt. Till det hör också reallokering av connections, dvs systemet kallar på Connection.close() från en dedikerad sql-wrapper klass som jag har skapat.
Nu till den lite kluvna frågan, efter att wrapper klassen har kallat å Connection.close() så bör jag "nulla" objektet innan metoden returnerar? Detta sköter ju gc senare (när den så vill). Men eftersom denna wrapper klass kan komma att användas ofta, beroende på hur aktivt systemet är i just det tillfället så kanske ska man explicit nulla det.
Sedan har jag vissa klasser som agerar som specifika sql-wrappers, dvs klassen sköter specifika sql-uppgifter (en klass sköter alla sql-kommandon relarade till inloggning medan en annan klass sköter alla sql-kommandon för att hämta nyaste nyhterna osv).
SqlWrapperClass:
innehar ett Connection-objekt samt metoder för att skapa PreparedStatement-objekt samt skicka sql-satser.
SqlActionWrapperClass:
innehar ett SqlWrapperClass för att genom den exekvera sql-satser.
När en metod i en SqlActionWrapperClass anropas så skapas ett ResultSet objekt då ett resultat väntas från sql-servern.
När objektet är bearbetad så avslutas metoden.
Just nu så anropar jag inte resultset.close() i dessa metoder, vilket jag kanske border göra. Sköter inte gc detta i sinom tid iaf?
Samma gäller Statement och PreparedStatement, jag anropar inte dess close() metod. När metoden avslutas så borde ju dessa objekt, som skapades inuti metoden frigöras pga att de inte har nån koppling till nån annan "levande" objekt, eller hur? Lämnas uppkopplingen mot databasen öppen då?
Det enda jag vinner på att anropa respektive close() metod vore väl då att öppnade sql-resurser frigörs?
Efter att SqlActionWrapperClass har gjort sitt, så anropas SqlWrapperClass:ens close() metod för att stänga kopplingen mot databasen.
Dessa frågor låter som "självklara" men jag ha inte alltid tänkt på dem. Nu vill jag optimera och skapa "god" kod.
Blev lite långt så hoppas ni orkar med detta... :)