[Java] HSQLDB SetLoginTimeOut threaded

Pagina: 1
Acties:

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
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:
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


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
even een subtiele kick ;)


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • momania
  • Registratie: Mei 2000
  • Laatst online: 13:23

momania

iPhone 30! Bam!

Lijkt je dit niet een makkelijkere oplossing: DriverManager.html#setLoginTimeout(int) ?
;)

Neem je whisky mee, is het te weinig... *zucht*


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
:O Helemaal vergeten te zeggen, het was me zo duidelijk omdat ik er al dagen mee bezig was.
SetLoginTimeOut is niet geimplementeerd in HSQLDB :(. Ja, en dat is kut.
Zie hier het relevante source code:
Java:
1
2
3
4
5
6
7
    public void setLoginTimeout(int seconds) throws SQLException {
        loginTimeout = 0;
    }

    public int getLoginTimeout() throws SQLException {
        return 0;
    }


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge