Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Zelenac 11. 04. 2016, 16:29:34

Název: Java - Finally neproběhne vždy
Přispěvatel: 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

Citace

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?
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Ondra Satai Nekola 11. 04. 2016, 16:33:09
Nemackat Ctrl-C.
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Lemming 11. 04. 2016, 16:35:01
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.
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Martin 11. 04. 2016, 16:35:38
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í :)
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: perceptron 11. 04. 2016, 16:46:38
shutdown hook

ak je proces nasilne ukonceny napr cez kill -9 nepomoze nic lebo by to islo proti zmyslu kill -9
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Kontraband 11. 04. 2016, 17:12:15
myslim, ze to bude tym, ze pouzivas JAVU, to vsetko vysvetluje ;)
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Filip Jirsák 11. 04. 2016, 17:13:46
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.
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: zboj 11. 04. 2016, 18:24:01
Zdravim,
zde pisou:
http://stackoverflow.com/questions/516049/in-java-is-the-finally-block-guaranteed-to-be-called-in-the-main-method

Citace

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í.
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Sten 11. 04. 2016, 18:59:38
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.
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Kontraband 11. 04. 2016, 19:07:10
panove serte na JAVU, zamerajte sa na nieco transcendentalne ako je C#
Název: Re:Java - Finally neprobehne vzdy
Přispěvatel: Pavel Tisnovsky 11. 04. 2016, 19:36:57
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.
Název: Re:Java - Finally neproběhne vždy
Přispěvatel: Ondra Satai Nekola 12. 04. 2016, 10:06:12
@Zelenac: nebyla ti tu uz nekolikrat doporucovana Effectiva Java od Blocha, btw?
Název: Re:Java - Finally neproběhne vždy
Přispěvatel: Ivan 12. 04. 2016, 14:03:29
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.
Název: Re:Java - Finally neproběhne vždy
Přispěvatel: zboj 12. 04. 2016, 14:09:35
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 :)
Název: Re:Java - Finally neproběhne vždy
Přispěvatel: Ivan 12. 04. 2016, 14:12:55
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).
Název: Re:Java - Finally neproběhne vždy
Přispěvatel: Sten 12. 04. 2016, 14:34:05
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é.
Název: Re:Java - Finally neproběhne vždy
Přispěvatel: none_ 12. 04. 2016, 17:35:34
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.