Partage
  • Partager sur Facebook
  • Partager sur Twitter

timeout sur connexion base de données oracle

lorsqu'une connexion à une base est interminable.

Sujet résolu
    1 juillet 2013 à 14:27:33

    Bonjour,

    je développe actuellement un script groovy (en me basant sur des classes Java, c'est pourquoi je poste ce sujet ici) pour tester la connexion à des bases de données oracle. Celui-ci fonctionne lorsqu'il tente de se connecter à certaines bases mais se bloque lorsque je lui demande de se connecter à une base particulière provocant ainsi l'arrête du script.

    J'ai essayé d'utiliser la méthode "DriverManager.setLoginTimeout(10); " pour avoir un timeout à 10 secondes (comme indiqué dans la documentation) mais le script se bloque toujours lors du test de cette base.

    Voici le code du script : 

    ici ListeCommande est un tableau répertoriant les paramètres de connexion, au rang :

    0 correspond le nom d'utilisateur,

    1 correspond le mot de passe de cet utilisateur

    2 correspond l'ip du serveur où se situe la base de données

    3 correspond le nom de la base de données

    int response = 1;
    try{
    	Class.forName("oracle.jdbc.driver.OracleDriver");
    
    	Connection connection = null;
    	DriverManager.setLoginTimeout(10);
    	Properties prop = new Properties();
    	prop.setProperty("user", listeCommande[0]);
    	prop.setProperty("password", listeCommande[1]);
    	connection = DriverManager.getConnection("jdbc:oracle:thin:@"+listeCommande[2]+":1521:"+listeCommande[3]+"", prop);
    	if (connection != null) {
    		response = 0;
    	}
    	connection.close();
    }catch (Exception e) {
    	System.out.println(e.toString());
    }
    output = reponse;

    Ce script renvoie donc 0 lorsque la connexion est établie ou 1 si la connexion à rencontré un problème.
    J'aimerais savoir comment faire pour que mon script , au bout d'un certains temps, reprenne la main en arrêtant la tentative de connexion à cette base.

    J'ai essayé les différentes techniques proposé sur différents site mais je n'ai pas trouvé mon bonheur.

    Merci d'avance !

    -
    Edité par glamare 1 juillet 2013 à 14:38:21

    • Partager sur Facebook
    • Partager sur Twitter
      2 juillet 2013 à 5:57:46

      Avec MySQL, il est nécessaire de passer le paramètre de timeout dans l'URL de connexion à la BDD, car la méthode setTimeoutLogin() n'a aucun effet (c'est un comportement spécifique à chaque driver, je ne sais pas comment se comporte celui d'Oracle à ce niveau).

      Du coup, tu peux essayer de modifier l'URL par un truc du genre :

      jdbc:oracle:thin:@...?connectTimeout=METTRE_ICI_LE_TEMPS_VOULU_EN_MILLISECONDES
      

      Si ça ne marche pas non plus, alors c'est un comportement spécifique à la DB et peut-être peux-tu intervenir directement sur le serveur en question pour modifier le temps maximal de traitement autorisé.

      Enfin, y'a toujours une solution crade basée sur l'utilisation d'un Thread, que tu laisses vivre X secondes uniquement et dans lequel tu testes ta connexion. L'avantage, c'est que si y'a rien après X secondes il suffit de tuer le Thread. L'inconvénient, c'est que ça durera toujours X secondes quoi qu'il arrive. Après, il suffit d'améliorer un peu le truc pour que si une connexion est retournée, le thread soit automatiquement interrompu. Cherche de ce côté là si tu n'as rien de plus intéressant !

      -
      Edité par Coyote 2 juillet 2013 à 5:59:40

      • Partager sur Facebook
      • Partager sur Twitter
        3 juillet 2013 à 13:14:15

        J'ai finalement opté pour la solution du thread exécuté en parallèle pendant que le script principal attend la fin de son exécution ou le tue au bout de X seconde(s).

        Merci Coyote pour ta réponse, cependant il s'agit, dans mon cas, d'une connexion à une base de données Oracle et j'avais déjà essayé la solution que tu propose mais qui ne marche pas sur ce type de base. (Mais j'ai maintenant confirmation que cela fonctionne avec MySQL, à moi de m'en souvenir si je travaille là dessus dans le futur !).

        Pour info voici ma solution : 

        classe de connexion en java : 

        package mon.package;
        
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.util.Properties;
        
        public class ConnexionOracle extends Thread {
        	private String user;
        	private String password;
        	private String ip;
        	private String nomBase;
        	private int response;
        
        	public int getResponse() {
        		return response;
        	}
        
        	public void setResponse(int response) {
        		this.response = response;
        	}
        
        	public ConnexionOracle(String[] listeCommande) {
        		super();
        		this.user = listeCommande[0];
        		this.password = listeCommande[1];
        		this.ip = listeCommande[2];
        		this.nomBase = listeCommande[3];
        		this.response = 1;
        	}
        
        	public void run() {
        		try {
        			Class.forName("oracle.jdbc.driver.OracleDriver");
        
        			Connection connection = null;
        			DriverManager.setLoginTimeout(1000);
        			Properties prop = new Properties();
        			prop.setProperty("user", this.user);
        			prop.setProperty("password", this.password);
        			connection = DriverManager.getConnection("jdbc:oracle:thin:@"
        					+ this.ip + ":1521:" + this.nomBase + "", prop);
        			if (connection != null) {
        				this.response = 0;
        			}
        			connection.close();
        		} catch (Exception e) {
        			;
        		}
        	}
        
        }
        

        Dans cette classe l'attribut response permettra de savori si le script a permis la connexion à la base (l'attribut sera alors égale à 0) ou si la connexion à échoué pour diverses raisons ( response = 1).

        et le script groovy lançant cette connexion (avec la création du thread "fils") : 

        import mon.package;
        
        def response = 1;
        //commande est la variable passée en paramètre au script
        String com = commande;
        String[] listeCommande = com.split(" ");
        /*
         * liste du contenu de listeCommande en fontion du rang :
         * 0 nom d'utilisateur
         * 1 password de l'utilisateur
         * 3 adresse du serveur de Bdd
         * 4 nom de la base de données
         */
        try{
        	ConnexionOracle conn = new ConnexionOracle(listeCommande);
        	conn.start();
        	conn.join(10000);
        	if(conn.getResponse() == null){
        		reponse = 1;
        	}else{
        		response = conn.getResponse();
        	}
        }catch (Exception e) {
        	;
        }
        
        
        output = response;



        • Partager sur Facebook
        • Partager sur Twitter

        timeout sur connexion base de données oracle

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown