Ejemplo: utilización de conexiones con simultaneidad
Una tarea Runnable o Callable puede utilizar las conexiones obtenidas por su componente creador mediante referencias de recursos java:comp.
Para obtener más información sobre las referencias de recursos, consulte el tema Referencias. El siguiente es un ejemplo de una tarea que utiliza las conexiones correctamente:
class GoodTask implements Callable<Object>
{
DataSource ds;
public Task() throws NamingException
{
// Almacenar en la memoria caché una fábrica de conexiones o un origen de datos
// como datos de instancia de clase.
InitialContext ic = new InitialContext();
// Se supone que el componente Java EE creado tiene esta
// referencia de recursos definida en el descriptor de despliegue.
ds = (DataSource)ic.lookup("java:comp/env/jdbc/myDataSource");
}
// Cuando se llame al método de bean asíncrono, obtenga una conexión,
// utilícela y ciérrela.
public Object call() throws SQLException
{
try (Connection c = ds.getConnection()) {
// Utilizar la conexión ahora.
return someResult;
}
}
}
El siguiente es un ejemplo de una tarea que utiliza las conexiones incorrectamente:
class BadTask implements Callable<Object>
{
DataSource ds;
// No haga esto. No puede almacenar en memoria caché conexiones entre llamadas a método.
Connection c;
public BadTask() throws NamingException, SQLException
{
// Almacenar en la memoria caché una fábrica de conexiones o un origen de datos como
// datos de instancia de clase.
InitialContext ic = new InitialContext();
ds = (DataSource)ic.lookup("java:comp/env/jdbc/myDataSource");
// Incumplimiento de las reglas.
c = ds.getConnection();
}
// Cuando se llame al método, utilice sin permiso la conexión en la memoria caché
// y probablemente verá excepciones relativas a J2C durante la ejecución.
public Object call()
{
// Utilizar la conexión ahora.
return someResult;
}
}