Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Zelenac 11. 04. 2016, 16:29:34
-
Zdravim,
zde pisou:
http://stackoverflow.com/questions/516049/in-java-is-the-finally-block-guaranteed-to-be-called-in-the-main-method
down vote
In a word, yes.
Code in the finally block in Java always executes unless:
The JVM exits during the try or catch block
The thread running the code is interrupted or killed during the try or catch block
(from: http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html)
So, unless you explicitly call System.exit(int), or kill the process or thread externally, you can rely on it.
Co tedy delat v pripade, mam-li napriklad pripojeni k oracle databazi, nebo jeste hur, mam X pripojeni k databazi a vkladam paralelne, a proces je zvenci v konzoli ukoncen, napr. pres CTRL+C ?
Connection se ve Finally neuzavre a zustane visit. To muze klidne zablokovat pristup do DB. Vcelku zavazna vec. Jak z toho ven?
-
Nemackat Ctrl-C.
-
Totéž co uděláš když přijde uklízečka a server uprostřed operace vypne protože divně hučí :D Prostě s takovou situací musíš počítat.
-
Napadá mě přidat shutdown hook a při něm vše zpracovat. Nevím však, zda je to ideální řešení :)
-
shutdown hook
ak je proces nasilne ukonceny napr cez kill -9 nepomoze nic lebo by to islo proti zmyslu kill -9
-
myslim, ze to bude tym, ze pouzivas JAVU, to vsetko vysvetluje ;)
-
Co tedy delat v pripade, mam-li napriklad pripojeni k oracle databazi, nebo jeste hur, mam X pripojeni k databazi a vkladam paralelne, a proces je zvenci v konzoli ukoncen, napr. pres CTRL+C ?
Connection se ve Finally neuzavre a zustane visit.
To se těžko může stát – neexistující proces nemůže držet otevřené spojení. Může nastat jedině to, že databáze ještě neví o tom, že spojení bylo ukončeno – což může nastat třeba tehdy, pokud vytrhnete síťový kabel, a počítač tak ani nemá šanci spojení ukončit.
Jak z toho ven?
Na straně klientské aplikace nijak, není důvod. Na straně serveru musíte počítat s tím, že se nějaký klient „odpojí“ bez ukončení spojení – někdo mu vytrhne síťový kabel, vypadne mu napájení apod. Takže musíte nastavit limity na počet spojení, počet spojení od jednoho klienta a dobu, po kterou může být spojení neaktivní, tak, aby to server přežil.
-
Zdravim,
zde pisou:
http://stackoverflow.com/questions/516049/in-java-is-the-finally-block-guaranteed-to-be-called-in-the-main-method
down vote
In a word, yes.
Code in the finally block in Java always executes unless:
The JVM exits during the try or catch block
The thread running the code is interrupted or killed during the try or catch block
(from: http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html)
So, unless you explicitly call System.exit(int), or kill the process or thread externally, you can rely on it.
Co tedy delat v pripade, mam-li napriklad pripojeni k oracle databazi, nebo jeste hur, mam X pripojeni k databazi a vkladam paralelne, a proces je zvenci v konzoli ukoncen, napr. pres CTRL+C ?
Connection se ve Finally neuzavre a zustane visit. To muze klidne zablokovat pristup do DB. Vcelku zavazna vec. Jak z toho ven?
Jak píšou jiní, to je záležitost databáze, ne Javy, chce to prostě nějaký timeout na nečekaně ukončená spojení.
-
Co tedy delat v pripade, mam-li napriklad pripojeni k oracle databazi, nebo jeste hur, mam X pripojeni k databazi a vkladam paralelne, a proces je zvenci v konzoli ukoncen, napr. pres CTRL+C ?
Connection se ve Finally neuzavre a zustane visit. To muze klidne zablokovat pristup do DB. Vcelku zavazna vec. Jak z toho ven?
Nezůstane. Operační systém uzavře všechna spojení při uklízení po ukončeném procesu.
-
panove serte na JAVU, zamerajte sa na nieco transcendentalne ako je C#
-
Co tedy delat v pripade, mam-li napriklad pripojeni k oracle databazi, nebo jeste hur, mam X pripojeni k databazi a vkladam paralelne, a proces je zvenci v konzoli ukoncen, napr. pres CTRL+C ?
Connection se ve Finally neuzavre a zustane visit. To muze klidne zablokovat pristup do DB. Vcelku zavazna vec. Jak z toho ven?
To se obecně musí (nějak) řešit pro jakýkoli program komunikující po síti, protože to není při komunikaci zcela transparentní - není hned jasné, že druhá strana data přijala, zda naopak něco neposlala (a zůstalo to viset, protože bagr zrovna překopl optiku) atd. Takže každá rozumná databáze si pro každé připojení (connection) nějak hlídá timeout, je to nastavitelné, stejně jako maximální počet současně vytvořených připojení.
Však si to vyzkoušej - stačí vytvořit připojení, killnout aplikaci a pořád sledovat otevřené porty - za nějaký čas se ten "databázový" port sám zavře.
-
@Zelenac: nebyla ti tu uz nekolikrat doporucovana Effectiva Java od Blocha, btw?
-
Zapomen na finaly (to slouzi uplne k necemu jinemu)
Pouzij try-with-resources:
https://blogs.oracle.com/WebLogicServer/entry/using_try_with_resources_with
Connection, Statement i ResultSet jsou AutoCloseable.
PS: (flame) tahle obdoba RAII byla pridana ve verzi Java7. C# uz to ma od zacatku.
-
Zapomen na finaly (to slouzi uplne k necemu jinemu)
Pouzij try-with-resources:
https://blogs.oracle.com/WebLogicServer/entry/using_try_with_resources_with
Connection, Statement i ResultSet jsou AutoCloseable.
PS: (flame) tahle obdoba RAII byla pridana ve verzi Java7. C# uz to ma od zacatku.
Jazyk bez RAII jako by nebyl :)
-
Connection se ve Finally neuzavre a zustane visit. To muze klidne zablokovat pristup do DB. Vcelku zavazna vec. Jak z toho ven?
Tohle je pomerne slozita tematika - pro zelenace. Pokud aplikace bezi na Linuxu, tak kernel uzavre jeji spojeni vzdy, pokud bezi na Windows tak je to slozitejsi. Sam Oracle podporuje DCD (dead connection detection), existuji zpusoby jak zajistit mohli klient i server kontrolovat, jestli je skutecne TCP spojeni aktivni(TCP Keepalive, SQLNET.EXPIRE_TIME).
-
Zapomen na finaly (to slouzi uplne k necemu jinemu)
Pouzij try-with-resources:
https://blogs.oracle.com/WebLogicServer/entry/using_try_with_resources_with
try-with-resources je jen syntax sugar pro try - finally. Ostatně je to tam hned na začátku ukázané.
-
Boze odpoved je jasna, tak uz to resit nemusite. Pokud je proces opravdu sestrelen, tak nema sanci se nejak rozumne ukoncit. A je jedno, o jaky programovaci jazyk se jedna. Vsechny dopadnou stejne. Je to proste ekvivalent vyrvani kabelu ze zdi. Kazdopadne, pokud je okolni svet spravne nakonfigurovan, tak se nic nedeje. Tzn. spravny timeout na DB. Postupne se otevrene spojeni zavrou, transakce rollbacknou a zacne se cekat na nova spojeni.