CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Nested exception connection timed out

[jack-sparrow]
[jack-sparrow]
Niveau 7
22 juin 2013 à 16:53:01

Bonjour !

Je travaille sur un prgramme depuis quelques temps et j'obtiens une erreur un peu aléatoire au bout de plusieurs heures.
Après pas mal de travail, j'ai réussi à réduire le code au maximum tout en ayant toujours l'erreur.

Voici l'erreur en question :

    • BEGIN NESTED EXCEPTION **

java.net.ConnectException
MESSAGE: Connection timed out
STACKTRACE:
...

Voici le code qui permet de créer l'erreur:

java.net.ConnectException: Connection timed out

public class MaClasse
{
public static int nb_connexions = 0;

public static void main(String[] args)
{
while(true)
{
nb_connexions++;

System.out.println("ouverture d'une connexion : "+nb_connexions);

Bdd bdd = new Bdd();
Bdd.Init("188.132.223.105", "3306", "base", "table", "pass");

bdd.Connection();

try { Thread.sleep(200); } catch(InterruptedException e) { System.out.println("Erreur sleep"); }

bdd.CloseConnection();
}
}
}

public class Bdd
{
public Connection connection = null;
private static GenericObjectPool connectionPool;
private static ConnectionFactory connectionFactory;
private static PoolingDriver driver;

public static void Init(String ip, String port, String base, String login, String pass)
{
String mysql_url = null;

if(port.equals(""))
{ mysql_url = "jdbc:mysql://"+ip+"/"+base; }
else
{ mysql_url = "jdbc:mysql://"+ip+":"+port+"/"+base; }

try
{
Class.forName("com.mysql.jdbc.Driver");

connectionPool = new GenericObjectPool(null);
connectionPool.setMaxActive(10000);
connectionFactory = new DriverManagerConnectionFactory(mysql_url,login, pass);
driver = new PoolingDriver();
driver.registerPool("example",connectionPool);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
System.out.println("Erreur lors de la connection à la BDD." + e);
}
}

public void Connection()
{
try
{
connection = connectionFactory.createConnection();
}
catch (Exception sql_erreur)
{
System.out.println("Erreur de connexion à la BDD." + sql_erreur);
}
}

public void CloseConnection()
{
try
{
connection.clearWarnings();
connection.close();
}
catch (SQLException e)
{
System.out.println("Erreur de fermeture de la BDD." + e);
}
}
}

Celle-ci apparaît souvent au bout de 2-3h voir plus sans raison apprente.
Avant qu'elle apparaissent, le programme à l'air de bloquer quelque part puisque le compteur nb_connexions n'augmente plus pendant un long moment.

J'ai lancé le programme sur 3 machines différentes :
- Chez moi en local : c'est ok
- Sur un serveur OVH : c'est ok
- Sur un VPS : l'erreur finit toujours par apparaitre.

Quelqu'un saurait comment résoudre le problème ?

Merci d'avance !

Cordialement.

godrik
godrik
Niveau 30
22 juin 2013 à 20:09:57

Donne le paquet d'exception completement.

KouicKouic
KouicKouic
Niveau 6
23 juin 2013 à 11:43:44

Il y a deux éléments distinct dans ton test : la déconnexion en timeout et le nombre de connexion maximum sur MySQL.

Intéresse toi au paramètre de MySQL puis aux paramètres system de keepalive et de timeout tcp du client, du serveur et des choses qu'il y a entre les deux.

Si plus aucune connexion n'est accepté c'est peut être parque MySQL n'en autorise qu'un certain nombre.
Si la connexion fini en timeout, après 2-3h d'inactivité, c'est qu'elle à été coupée par un équipement.
En regardant ton code, on ne peux pas déterminer d'où ça vient. Il est possible de la connexion ait été coupée depuis un certain temps déjà.
Normalement, en jouant sur la config tcp tu pourrais résoudre le problème.
En parallèle, tu peux aussi te demander si il est vraiment nécessaire de maintenir une connexion ouverte si aucune donnée utile n'y passe.

KouicKouic
KouicKouic
Niveau 6
23 juin 2013 à 11:49:05

Tiens, j'avais louper la ligne ou tu coupes la connexion après 200 ms. J'ai taper pour rien.
Je pencherai alors plus pour une restriction de l'hébergeur qui pourrait limiter une forme potentielle de hammering.

[jack-sparrow]
[jack-sparrow]
Niveau 7
23 juin 2013 à 17:09:23

Merci de vos réponses et désolé pour la mauvaise lisibilité du code :/

voici l'erreur en entier :

    • BEGIN NESTED EXCEPTION **

java.net.ConnectException
MESSAGE: Connection timed out

STACKTRACE:

java.net.ConnectException: Connection timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl
.java:351)

at java.net.PlainSocketImpl.connectToAddress(PlainSoc
ketImpl.java:213)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.j
ava:200)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.j
ava:366)

at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:218)
at com.mysql.jdbc.StandardSocketFactory.connect(Stand
ardSocketFactory.java:256)

at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.j
ava:2771)

at com.mysql.jdbc.Connection.<init>(Connection.java:1
555)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonReg
isteringDriver.java:285)

at java.sql.DriverManager.getConnection(DriverManager
.java:582)

at java.sql.DriverManager.getConnection(DriverManager
.java:185)

at org.apache.commons.dbcp.DriverManagerConnectionFac
tory.createConnection(DriverManagerConnectionFacto
ry.java:75)

at bdd.Bdd.Connection(Bdd.java:79)
at Analyseur.main(MaClasse.java:24)

    • END NESTED EXCEPTION **

Last packet sent to the server was 1 ms ago.
Exception in thread "main" java.lang.NullPointerException
at bdd.Bdd.CloseConnection(Bdd.java:91)
at Analyseur.main(MaClasse.java:28)

_skip
_skip
Niveau 10
24 juin 2013 à 08:29:41

Salut,
Le meilleur moyen d'utiliser une pool de connexions est de passer par un DataSource générique que tu construis une seule fois Regarde ici pour un exemple d'utilisation de dbcp :

http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/PoolingDataSourceExample.java?revision=1143885&amp;view=markup

En gros tu ferais bien de balancer cette grosse classe moche mais avant cela, il faut se dire que souvent par défaut à moins que tu aies modifié la configuration c'est maximum 100 connexions simultanées.
Faudrait dimensionner ton pool plus modestement.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment