Le pilote JDBC SQL Server ne peut pas détecter la connection perdue rapidement

J'utilise le pilote JDBC sqlserver-jdbc-4.0.jar pour sqlserver-jdbc-4.0.jar connecter à SQL Server. J'ai créé une connection et l'ai utilisée avec succès.

Puis j'ai éteint l'interface réseau de la machine SQL Server. Lorsque j'exécute la command suivante, le pilote JDBC sur le côté de mon application nécessite environ 15 minutes pour comprendre que la connection est perdue. J'ai essayé plusieurs choses:

  1. properties du pilote JDBC configuré LoginTimeout=5, LockTimeout=5, QueryTimeout=5 (5 secondes)
  2. appelé Statement.setQueryTimeout() pour définir le timeout d'attente à 5 secondes
  3. appelé Connection.isValid() avec 5 secondes de timeout – il est également resté coincé pendant 15 minutes

Une autre option possible – Connection.setNetworkTimeout() mais elle n'est pas implémentée par le pilote SQL Server. Je ne peux pas non plus atteindre le socket utilisé par le pilote JDBC pour configurer TCP Keepalive.

Si je ferme la connection, puis l'ouvre à nouveau, il comprend immédiatement que l'instance SQL Server est inaccessible.

Comment puis-je surmonter mon problème et détecter la perte de connection en quelques secondes au lieu de 15 minutes?

Microsoft MSSQL-JDBC est maintenant Open source. Récemment, l'équipe MSSQL-JDBC a implémenté sockettimeout & querytimeout s. Cela va définitivement résoudre votre problème.