Ik zit met een probleem om HSQLDB aan de praat te krijgen als een niet-bestaande connectie geopend wordt. Alles gaat goed zolang er een URL gegeven wordt naar de databasemanager waar HSQLDB op draait (success), of niks op draait (SQLException). Maar zodra je het een URL geeft waar bijvoorbeeld een http server runt (per ongeluk), dan hangt de hele applicatie zo'n 10 minuten omdat BufferedInputStream.read() blijft hangen.
Ik dacht slim te zijn en de connectie in een andere thread te laten runnen en dan interrupt() roepen, maar hij reageert er helemaal niet op. Ook niet op stop(). destroy() die het echt zou moeten killen is niet geimplementeerd...dus het gaat niet.
Ik vraag me af of dit mogelijk is of is de weg die ik heb genomen helemaal verkeerd?
Een oplossing voor een stand-alone programma is thread.setDaemon(true) te zetten die de geblockte thread killt nadat main() klaar is. Maar aangezien het programma als servlet moet draaien op tomcat, werkt dit niet.
Zie de code hieronder:
(let er niet op dat de thread implementatie in de main class zit, het was alleen maar om te testen)
Ik dacht slim te zijn en de connectie in een andere thread te laten runnen en dan interrupt() roepen, maar hij reageert er helemaal niet op. Ook niet op stop(). destroy() die het echt zou moeten killen is niet geimplementeerd...dus het gaat niet.
Ik vraag me af of dit mogelijk is of is de weg die ik heb genomen helemaal verkeerd?
Een oplossing voor een stand-alone programma is thread.setDaemon(true) te zetten die de geblockte thread killt nadat main() klaar is. Maar aangezien het programma als servlet moet draaien op tomcat, werkt dit niet.
Zie de code hieronder:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| import java.sql.*; class test { private static class DatabaseThread extends Thread { private Thread _thread; private boolean _success = false; boolean is_success() { return _success;} void set_success(boolean _success) {this._success = _success;} public DatabaseThread (Thread thread) {_thread = thread;} public void run() { try { Class.forName("org.hsqldb.jdbcDriver"); @SuppressWarnings("unused") Connection _conn = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost:80/weblog", "sa", "weblog"); /** * The database has successfully opened, we let the main thread * know this so it does not have to wait any longer. */ set_success(true); _thread.interrupt(); } catch (Exception e) { System.out.println(e.getMessage()); } } } public static void main(String[] args) throws Exception { DatabaseThread db_thread = new DatabaseThread(Thread.currentThread()); // db_thread.setDaemon(true); db_thread.start(); try { Thread.sleep(3000); if (!db_thread.is_success()) { System.out.println("Cannot connect"); db_thread.interrupt(); // .stop(), .destroy() just kill it @#$ throw new Exception(); } } catch (InterruptedException e) { System.out.println("Database opened successfully"); } } } |
(let er niet op dat de thread implementatie in de main class zit, het was alleen maar om te testen)
Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge