Exemple : Utilisation de connexions avec des accès concurrents
Une méthode exécutable ou appelable peut utiliser les connexions que le component par lequel elle a été créée a obtenues à l'aide de références de ressource java:comp.
Pour plus d'informations sur les références de ressources, reportez-vous à la rubrique Références. L'exemple suivant présente une tâche qui utilise correctement des connexions :
class GoodTask implements Callable<Object>
{
DataSource ds;
public Task() throws NamingException
{
// Mettre en cache une fabrique de connexions ou une source de données
// en tant que données d'instance de classe.
InitialContext ic = new InitialContext();
// On suppose que le composant Java EE créé possède cette
// référence de ressource définie dans son descripteur de déploiement
ds = (DataSource)ic.lookup("java:comp/env/jdbc/myDataSource");
}
// Lors de l'appel de la méthode de bean asynchrone, établissement d'une connexion,
// utilisation de la connexion et fermeture de celle-ci.
public Object call() throws SQLException
{
try (Connection c = ds.getConnection()) {
// Utilisez la connexion maintenant.
return someResult;
}
}
}
L'exemple suivant présente une tâche qui utilise des connexions de manière incorrecte :
class BadTask implements Callable<Object>
{
DataSource ds;
// A éviter. Vous ne pouvez pas mettre en cache des connexions via des appels de méthode.
Connection c;
public BadTask() throws NamingException, SQLException
{
// Mettre en cache une fabrique de connexions ou une source de données
// en tant que données d'instance de classe.
InitialContext ic = new InitialContext();
ds = (DataSource)ic.lookup("java:comp/env/jdbc/myDataSource");
// Ici, les règles ne sont pas respectées.
c = ds.getConnection();
}
// Lors de l'appel de la méthode, l'utilisation de la connexion mise en cache n'est pas valide
// et vous pouvez constater des exceptions liées à J2C lors de
l'exécution.
public Object call()
{
// Utilisez la connexion maintenant.
return someResult;
}
}