web-dev-qa-db-fra.com

Délai de connexion pour DriverManager getConnection

J'essaie de me connecter à la base de données à l'aide de la méthode standard JDBC

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

Existe-t-il une valeur maximale de timeout sur la connexion, combien de temps dure une connexion, puis-je l'augmenter? Je souhaite que la connexion soit ouverte pour toujours, est-ce une bonne idée?.

22
kal

La valeur est généralement contrôlée par une base de données. Vous n'avez aucun contrôle sur cela en utilisant le code. Cela dépend du serveur de base de données utilisé. Il est généralement d'environ 30 minutes à une heure.

D'autre part, garder une Connection ouverte pour toujours est une très mauvaise idée. La meilleure pratique est d’acquérir et close Connection, Statement et ResultSet dans la portée shortest possible afin d’éviter les fuites de ressources et les blocages potentiels des applications causés par les fuites et les délais.

Certes, la connexion à la base de données est une tâche coûteuse. Si votre application est supposée fonctionner assez longtemps et connecter la base de données assez souvent, envisagez d'utiliser un pool de connexions pour améliorer les performances de connexion. Si votre application est une application Web, consultez la documentation du serveur d'applications, elle fournit généralement une fonctionnalité de regroupement de connexions sous la forme d'une DataSource. S'il s'agit d'une application cliente, recherchez des bibliothèques de mise en pool de connexions tierces qui ont prouvé leur robustesse au fil des années, telles que Apache Commons DBCP (couramment utilisé, utilisé dans les appservers de lot), C3P0 Hibernate) et Proxool (si vous voulez des connexions XA).

N'oubliez pas que lorsque vous utilisez un pool de connexions, vous devez toujours écrire le code JDBC approprié, i.o.w. acquérir et fermer toutes les ressources dans la portée la plus courte possible. À son tour, le pool de connexions aura à cœur de fermer la connexion ou de la relâcher dans le pool pour une réutilisation ultérieure.

Vous pouvez obtenir des informations supplémentaires sur cet article comment utiliser correctement les bases de JDBC.

J'espère que cela aide et codage heureux.

26
BalusC

Vous pouvez définir le délai d’expiration sur le DriverManager comme suit:

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

Ce qui impliquerait que si la connexion ne peut pas s'ouvrir dans le délai imparti, elle expire.

En termes de maintien d'une connexion ouverte pour toujours, il est possible que vous ne fermiez pas la connexion, mais ce n'est peut-être pas une bonne idée. Les connexions doivent être fermées dès que vous avez terminé.

Si vous souhaitez optimiser l'ouverture et la fermeture des connexions, vous pouvez utiliser un pool de connexions.

28

Republiez simplement une réponse plus complète d'un commentaire de l'utilisateur flamming_python comme réponse, car cela a fonctionné pour moi:

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

Commentaire original:
"LoL @ vos threads - vous pouvez le faire tout simplement en créant un objet Properties prop, puis prop.put (" connectTimeout "," 2000 ") passez votre objet prop à la méthode DriverManager.getConnection () avec votre url "

7
Felix

Voici comment procéder avec le pilote Connector/J MYSQL:

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

Cela a fonctionné pour moi après que setLoginTimeout() n'ait rien fait.

6
QQ_QQ

Comme bestro l'a suggéré, il est possible d'utiliser un avenir avec un délai d'attente associé. Par exemple:

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