Question

j'ai un javax.sql.DataSource que je souhaite utiliser dans plusieurs servlets.Je n'aime pas l'idée de préciser :

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

dans chaque servlet, car il me semble que le framework devra rechercher la DataSource pour chaque servlet et si le nom de la DataSource change, chaque servlet devra également changer.

Mon idée est de déclarer un EJB Singleton qui pourra ensuite être déclaré dans chaque 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();
    }
}

Est-ce une manière raisonnable de résoudre le problème ?Je pense que c'est un peu lourd pour quelque chose que j'aurais pensé être un problème courant.

Était-ce utile?

La solution

En général, ça va, IMO.Mais s'il vous plaît, ne laissez pas le bean renvoyer la connexion mais directement la DataSource.Certains AppServers comme WebSphere fermeront automatiquement la connexion lorsque le contexte du bean sera à nouveau quitté.

Une autre solution serait d'utiliser @Resource(name="myds") au lieu de la recherche.Si tous vos servlets se trouvent dans une seule application Web, vous pouvez définir une référence de ressource avec res-ref-name myds dans votre web.xml et la résoudre avec le vrai nom de recherche uniquement à cet endroit.

Autres conseils

Je dirais que l'utilisation d'un EJB uniquement pour cette raison peut être un peu trop lourde comme vous l'avez écrit.

Premièrement, la plupart des serveurs d'applications modernes mettront en cache cette recherche, ce qui ne sera donc pas si coûteux.

Deuxièmement, vous pouvez utiliser @Resource(name="myds") comme l'a dit Robert, qui utiliserait la même référence de ressource, qui peut être mappée au nom JNDI à l'aide des fonctions de mappage du serveur d'applications.

Troisièmement, vous pouvez utiliser CDI pour avoir uniquement une solution de module Web comme celle-ci :

Créez une classe contenant votre définition DataSource comme ceci :

public class Datasources {

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

Et puis utilisez-le servlet en utilisant Inject :

public class MyServlet extends HttpServlet {
    @Inject 
    private DataSource myDs;   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top