Pregunta

tengo un javax.sql.DataSource que quiero usar en múltiples servlets.No me gusta la idea de especificar:

@Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
private DataSource liveDataSource_;

en cada servlet, me parece que el marco tendrá que buscar el origen de datos para cada servlet y si el nombre del origen de datos cambia, cada servlet también tendrá que cambiar.

Mi idea es declarar un EJB Singleton que luego pueda declararse en cada servlet:

@Startup
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class DataSources {  
    @Resource(name="live-connection", lookup="java:/live-connection", description="Live DB Connection")
    private DataSource liveDataSource_;

    public synchronized Connection getLiveConnection() throws SQLException {
        return liveDataSource_.getConnection();
    }
}

¿Es esta una forma razonable de resolver el problema?Siento que es un poco duro para algo que habría pensado que sería un problema común.

¿Fue útil?

Solución

En general, está bien en mi opinión.Pero no permita que el bean devuelva la conexión sino directamente el origen de datos.Algunos servidores de aplicaciones como WebSphere cerrarán automáticamente la conexión cuando se abandone nuevamente el contexto del bean.

Otra solución sería utilizar @Resource(name="myds") en lugar de buscar.Si todos sus servlets están en una aplicación web, entonces puede definir un recurso-ref con res-ref-name myds en su web.xml y resolverlo con el nombre de búsqueda real solo en ese lugar.

Otros consejos

Yo diría que usar un EJB solo por ese motivo puede ser demasiado pesado como usted escribió.

En primer lugar, la mayoría de los servidores de aplicaciones modernos almacenarán en caché esa búsqueda, por lo que no será tan costoso.

En segundo lugar, puede usar @Resource(name="myds") como dijo Robert, que usaría la misma referencia de recurso, que se puede asignar al nombre JNDI utilizando las funciones de asignación del servidor de aplicaciones.

En tercer lugar, podría usar CDI para tener una solución de módulo web única como esta:

Cree una clase que contenga su definición de DataSource de esta manera:

public class Datasources {

    @Produces @Resource(name="jdbc/yourRef", lookup="yourJNDI")
    DataSource myDataSource;
}

Y luego úselo servlet usando Inject:

public class MyServlet extends HttpServlet {
    @Inject 
    private DataSource myDs;   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top