IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Problèmes Multiples connexions


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 26
    Points : 22
    Points
    22
    Par défaut Problèmes Multiples connexions
    Bonjour
    C'est juste une petite question sur ce qu'il est bon de faire.
    J'ai codé une classe se connectant à une base de données et exécutant des requêtes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    public class SqlQuery 
    {
    	private Properties _prop = new Properties();
    	private Connection _con;
    	private Statement _statement;
    	private String _host;
    	private String _user;
    	private String _passw;
    	private String _db;
     
     
    	public SqlQuery()
    	{
    		try {
    			_prop = PropsUtils.load( new File("Properties/sql.properties") );
    		}
    		catch (Exception e1) {
    			e1.printStackTrace();
    		}
    		_user = _prop.getProperty( "sql.user" );
    		_passw = _prop.getProperty( "sql.pass" );
    		_host = _prop.getProperty( "sql.host" );
    		_db = _prop.getProperty( "sql.db" );		
    	}
     
    	public void connect() throws SQLException, Exception
    	{
    		System.out.println( "NEW CONNECTION" );
    		Class.forName("com.mysql.jdbc.Driver");
     
    		if( _host.compareTo("localhost") == 0 )
    		{
    			String host = "jdbc:mysql://" + _host + "/" + _db + "?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull";
    			_con = DriverManager.getConnection( host, _user, _passw );
    		}
    		else
    		{
    //			String host = "jdbc:mysql://"+ _host + ":3306/" + _db + "?useUnicode=true&characterEncoding=UTF-8";
    			String host = "jdbc:mysql://"+ _host + ":3306/" + _db;
    			_con = DriverManager.getConnection( host, _user, _passw );
    		}
    		_statement = _con.createStatement( ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE );
    	}
     
    	public ResultSet requete( String requete ) throws SQLException
    	{
    		ResultSet rs = null;
    		rs = _statement.executeQuery( requete );
    		return rs;
    	}
     
    	public ResultSet requeteUpdate( String requete ) throws SQLException
    	{
    		_statement.executeUpdate( requete, Statement.RETURN_GENERATED_KEYS );
    		ResultSet rs = _statement.getGeneratedKeys();
    		return rs;
    	}	
     
     
    	public void close() throws SQLException
    	{
    		_con.close();
    		_statement.close();
    	}
     
    }


    Le truc c'est que j'appel énormément de fois cette classe via diverses méthodes un peu partout dans mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql.connect();			
    ResultSet rs = sql.requete( req );
    sql.close();
    Ce qui provoque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket.
     
    This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 
     
    For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.
    J'ai essayé de ne déclarer qu'une instance de ma classe SqlQuery et de passer cette instance en paramètres de mes fonctions mais la j'ai une erreur me Disant que le ReusltSet à déjà été fermé.

    Pourriez vous m'éclairer sur la bonne façon de procéder.
    MErci d'avance.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Je me trompe peut-être mais si je comprend bien ton problème la classe de connexion que je te propose devrait te permettre de n'avoir qu'une seule connexion. Elle utilise le pattern Singleton.
    Voir la classe ci-dessous :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
     
    public class SimpleConnection {
     
    	private static SimpleConnection simpleConnection = null;
     
    	private SimpleConnection(){
    		try{
    			String driver = ChargeProperty.getInstance().getPropriete("driver");
    			Class.forName(driver);
    		}
    		catch(ClassNotFoundException cnfe){}
    	}
     
    	public static synchronized SimpleConnection getInstance(){
    		if(simpleConnection == null){
    			simpleConnection = new SimpleConnection();
    		}
    		return simpleConnection;
    	}
     
    	public Connection getConnection(){
    		String url = ChargeProperty.getInstance().getPropriete("url");
    		String login = "root";
    		String password = "";
    		Connection c = null;
    		try{
    			c = (Connection) DriverManager.getConnection(url, login, password);
    		}
    		catch(SQLException sqle){}
    		return c;
    	}
    }
    Sachant que j'ai un fichier properties dans lequel est stocké l'adresse du serveur mysql ainsi que le driver comme si dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    config.properties :
    driver = com.mysql.jdbc.Driver
    url = jdbc:mysql://host:port/bdd
    En espérant que cela va t'aider

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Merci @Poum19
    Je vais tester cela.
    l'idée serait de ne créer qu'une instance de "SimpleConnection" et ensuite de passer un élément de type Connection (récupérer via GetInstance de ta classe) en paramètre à chaque fonction éxécutant une requête Sql.
    Afin de limiter le nombre de socket.

    Je test cela, pas mal de modifs à faire et met à jour le post suivant le résultats des test.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par teroux Voir le message
    Merci @Poum19
    Je vais tester cela.
    l'idée serait de ne créer qu'une instance de "SimpleConnection" et ensuite de passer un élément de type Connection (récupérer via GetInstance de ta classe) en paramètre à chaque fonction éxécutant une requête Sql.
    Afin de limiter le nombre de socket.

    Je test cela, pas mal de modifs à faire et met à jour le post suivant le résultats des test.

    Alors Test done.
    Je vais beaucoup plus loin qu'avant, cad il éxécute beaucoup plus de requêtes avant de planter.

    J'ai procéder comme cela

    je déclare

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Connection c = SimpleConnection.getInstance().getConnection();
    Ensuite
    J'appel la fonction getLibel( ..., c ) avec la connection établie en boucle c'est à dire plusieurs milliers de fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    	private String getLibel( String table, String id, Connection c )
    	{		
    		if( id == null || id == "" ) {
    			return null;
    		}
    		String libel = null;
    		String req = "SELECT * FROM "+ table + " WHERE id=" + id;
     
    		ResultSet rs = null;
    		try 
    		{
    			Statement st = c.createStatement( ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE );
    			rs = st.executeQuery( req );			
    			while( rs.next() ) {			
    				libel = rs.getString( 2 );
    			}
    		} 
    		catch (SQLException e1) {
    			e1.printStackTrace();
    		}
     
    		return libel;		
    	}

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 26
    Points : 22
    Points
    22
    Par défaut
    Alors,
    Résolu mon problème
    Merci à @Poum19.
    Je me suis servi aussi de ce : http://www.developpez.net/forums/d60...ace-resultset/
    Pour la gestion des PreparedStatement et compagnie.

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Première installation] Problème de connexion
    Par sekiryou dans le forum Installation
    Réponses: 2
    Dernier message: 02/03/2004, 19h18
  2. [ Oracle 9ias / 10g] problème de connexion
    Par Boosters dans le forum JDeveloper
    Réponses: 2
    Dernier message: 20/01/2004, 17h23
  3. Problème de connexion au serveur MYSQL
    Par ETOKA dans le forum Outils
    Réponses: 2
    Dernier message: 27/11/2003, 09h28
  4. Réponses: 11
    Dernier message: 13/10/2003, 14h48
  5. problème de connexion 2 PC
    Par guitalca dans le forum Développement
    Réponses: 3
    Dernier message: 22/09/2003, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo