Java - Finally neproběhne vždy

Zelenac

Java - Finally neproběhne vždy
« kdy: 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?
« Poslední změna: 11. 04. 2016, 22:24:42 od Petr Krčmář »


Re:Java - Finally neprobehne vzdy
« Odpověď #1 kdy: 11. 04. 2016, 16:33:09 »
Nemackat Ctrl-C.

Lemming

Re:Java - Finally neprobehne vzdy
« Odpověď #2 kdy: 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.

Martin

Re:Java - Finally neprobehne vzdy
« Odpověď #3 kdy: 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í :)

perceptron

Re:Java - Finally neprobehne vzdy
« Odpověď #4 kdy: 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


Kontraband

Re:Java - Finally neprobehne vzdy
« Odpověď #5 kdy: 11. 04. 2016, 17:12:15 »
myslim, ze to bude tym, ze pouzivas JAVU, to vsetko vysvetluje ;)

Re:Java - Finally neprobehne vzdy
« Odpověď #6 kdy: 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.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Java - Finally neprobehne vzdy
« Odpověď #7 kdy: 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í.

Sten

Re:Java - Finally neprobehne vzdy
« Odpověď #8 kdy: 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.

Kontraband

Re:Java - Finally neprobehne vzdy
« Odpověď #9 kdy: 11. 04. 2016, 19:07:10 »
panove serte na JAVU, zamerajte sa na nieco transcendentalne ako je C#

Pavel Tisnovsky

Re:Java - Finally neprobehne vzdy
« Odpověď #10 kdy: 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.

Re:Java - Finally neproběhne vždy
« Odpověď #11 kdy: 12. 04. 2016, 10:06:12 »
@Zelenac: nebyla ti tu uz nekolikrat doporucovana Effectiva Java od Blocha, btw?

Ivan

Re:Java - Finally neproběhne vždy
« Odpověď #12 kdy: 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.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Java - Finally neproběhne vždy
« Odpověď #13 kdy: 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 :)

Ivan

Re:Java - Finally neproběhne vždy
« Odpověď #14 kdy: 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).