it-swarm.com.de

Verbindungs-Timeout für DriverManager getConnection

Ich versuche, eine Verbindung zur DB auf die Standard-JDBC-Methode herzustellen

connection = DriverManager.getConnection(url, username, password);

Gibt es einen maximalen Timeout-Wert für die Verbindung, wie lange dauert eine Verbindung? Ich möchte, dass die Verbindung für immer offen ist, ist es eine gute Idee.

22
kal

Der Wert ist normalerweise DB-gesteuert. Sie haben keine Kontrolle über den Code. Dies hängt vom verwendeten DB-Server ab. Es ist normalerweise ungefähr 30 Minuten bis zu einer Stunde.

Andererseits ist es eine sehr schlechte Idee, ein Connection für immer offen zu halten. Es ist empfehlenswert, und close Connection, Statement und ResultSet im kürzesten Bereich zu erwerben, um Ressourcenlecks und potenzielle Anwendungsabstürze durch Leckagen und Timeouts zu vermeiden.

Das Anschließen der Datenbank ist zwar eine kostspielige Aufgabe. Wenn Ihre Anwendung relativ lange laufen soll und die DB relativ häufig verbunden wird, sollten Sie einen Verbindungspool verwenden, um die Verbindungsleistung zu verbessern. Wenn Ihre Anwendung eine Webapplikation ist, werfen Sie einen Blick in die Dokumentation des Appservers. In der Regel wird eine Verbindungspooling-Funktion in Anlehnung an DataSource bereitgestellt. Wenn es sich um eine Clientanwendung handelt, suchen Sie nach Verbindungspooling-Bibliotheken von Drittanbietern, die ihre Robustheit seit Jahren bewiesen haben, beispielsweise Apache Commons DBCP (häufig verwendet, in Los-Appservern verwendet), C3P0 (bekannt aus Ruhezustand) und Proxool (wenn Sie XA-Verbindungen möchten).

Denken Sie daran, dass Sie bei Verwendung eines Verbindungspools immer noch den richtigen JDBC-Code (i.o.w.) schreiben müssen. erwerben und schließen alle Ressourcen in kürzester Zeit. Der Verbindungspool muss seinerseits sorgen, dass die Verbindung tatsächlich geschlossen oder für eine weitere Verwendung wieder freigegeben wird.

In diesem Artikel erfahren Sie, wie Sie die JDBC-Grundlagen richtig einsetzen.

Hoffe das hilft und fröhliche Kodierung.

26
BalusC

Sie können das Timeout im DriverManager folgendermaßen einstellen:

 DriverManager.setLoginTimeout(10);
 Connection c = DriverManager.getConnection(url, username, password);

Dies würde bedeuten, dass die Verbindung nicht innerhalb der angegebenen Zeit geöffnet werden kann.

Wenn Sie eine Verbindung für immer offen halten, ist es möglich, dass Sie die Verbindung nicht trennen, es ist jedoch keine gute Idee. Verbindungen sollten geschlossen werden, sobald Sie damit fertig sind.

Wenn Sie das Öffnen und Schließen von Verbindungen optimieren möchten, können Sie einen Verbindungspool verwenden.

28

Um eine vollständigere Neuauflage eines Kommentars des Benutzers flamming_python als Antwort zu veröffentlichen, weil es für mich funktioniert hat:

dbConnectionString = "jdbc:mysql://"+dbHost+":"+dbPort+"/"+dbTable+"?user="+dbUser+"&password="+dbPassword;
Properties properties = new Properties();
properties.put("connectTimeout", "2000");
dbConnect = DriverManager.getConnection(dbConnectionString, properties);

Ursprünglicher Kommentar:
"LoL @ your Threads - Sie können dies ganz einfach tun, indem Sie ein Eigenschaftenobjekt prop, dann prop.put (" connectTimeout "," 2000 ") (wobei" 2000 "das Timeout in ms ist) und dann Übergeben Sie Ihr Prop-Objekt zusammen mit Ihrer URL an die DriverManager.getConnection () - Methode. "

7
Felix

So gehen Sie mit dem Connector/J MYSQL-Treiber vor:

String qqq = "jdbc:mysql://localhost/Test?connectTimeout=TIME_IN_MILLIS";
conn = DriverManager.getConnection(qqq, db_user, db_pass);

Es hat für mich funktioniert, nachdem setLoginTimeout() nichts getan hat.

6
QQ_QQ

Wie bereits erwähnt, ist es möglich, eine Zukunft mit einem zugehörigen Timeout zu verwenden. Zum Beispiel:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Connection> future = executor.submit(new Callable<Connection>() {

    @Override
    public Connection call() throws Exception {
        Connection con = DriverManager.getConnection(url, username, password);
        return con;
    }
});

Connection con = null;
try {
    con = future.get(5, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
    Logger.getLogger(Scratch.class.getName()).log(Level.SEVERE, null, ex);
}
executor.shutdownNow();

if (con == null) {
    System.out.println("Could not establish connection");
} else {
    System.out.println("Connection established!");
}
0
Fidel