Ajouter un commentaire

fredericmazue

jrebillat wrote:

dans le code Java, se connecter au serveur:
Connection connect; 
try 
{ 
	Class.forName("org.gjt.mm.mysql.Driver"); 
	connect = DriverManager.getConnection( 
		"jdbc:mysql://nom du serveur/nom de la base", 
		"nom du user", "mot de passe"); 
} 
catch (Exception e) 
{ 
	e.printStackTrace(); 
}

Pas tout à fait. Sans aucun doute ce code fonctionne dans une situation rudimentaire, à savoir une seule connexion à titre d'essai pour se faire la main, mais est il porteur de problèmes dans une application professionnelle. Quitte à apprendre, pourquoi ne pas apprendre dans les règles de l'art depuis le début ?
En programmation, que ce soit en Java ou avec un autre langage, on doit se soucier de la gestion des ressources potentiellement rares ou sur lesquelles on a pas une maîtrise complète. Une connexion JDBC tombe dans ces deux catégories. Une base de données ne permet qu'un nombre limitées de connexions simultanées et elle gère en général ces connexions dans un pool qui vit en dehors de l'application Java. Dans ce contexte le programmeur doit avoir le souci de libérer les connexions au plus vite et en toutes circonstances, même en cas d'erreurs. En C++ par exemple cela se fait dans des destructeurs. Il n'y a pas de destructeurs en Java, mais on y trouve une contre-partie dans les blocs finally qui eux n'existent pas en C++ puisqu'il y a les destructeurs ;)
Bref, voici l'idiome consacré pour une bonne gestion des connexions

Connection connect;
try 
{ 
	Class.forName("org.gjt.mm.mysql.Driver"); 
	connect = DriverManager.getConnection( 
		"jdbc:mysql://nom du serveur/nom de la base", 
		"nom du user", "mot de passe"); 
	// faire quelque chose avec la connexion
} 
catch (Exception e) 
{ 
	e.printStackTrace(); 
}
finally
{
	if(connect != null)
		connect.close();
}

Ensuite les erreurs qui peuvent se produire pendant le "faire quelque chose avec la connexion" doivent pouvoir remonter afin que la connexion soit fermée, d'abord pour libérer la ressource et aussi parce que si une erreur s'est produite, il est possible que la connexion ne soit plus en état de travailler correctement. Il ne faut donc pas museler l'exception (l'impression de la trace ne constitue pas un traitement et équivaut à museler) mais au contraire la relancer. Donc:

jrebillat wrote:

4- Ensuite on peut lancer des actions
try 
{ 
	PreparedStatement stm = connect.prepareStatement( 
	"update " + table + " set " + column + "='" + 
	value + "' where " + colref + "=" + valref + ";"); 
	return stm.execute(); 
} 
catch (Exception e) 
{ 
	e.printStackTrace();
}

doit devenir:

try 
{ 
	PreparedStatement stm = connect.prepareStatement( 
	"update " + table + " set " + column + "='" + 
	value + "' where " + colref + "=" + valref + ";"); 
	return stm.execute(); 
} 
catch (Exception e) 
{ 
	e.printStackTrace();
	throw e; 
}

On trouve ces recommandations dans tous les bons ouvrages sur le sujet, je pense par exemple à J2EE 1.4 de James Weaver, qui fait autorité en la matière et dont les chapitres sur JDBC sont exhaustifs. :)

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 III  DDD   M   M  DDD    CCC 
I D D MM MM D D C
I D D M M M D D C
I D D M M D D C
III DDD M M DDD CCC