Domanda

Ho un javax.sql.DataSource che voglio usare in più servlet.Non mi piace l'idea di specificare:

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

In ogni servlet come mi sembra che il framework dovrà cercare il DataSource per ogni servlet e se il nome del DataSource cambia, ogni servlet dovrà cambiare anche.

La mia idea è quella di dichiarare un singleton ejb che può quindi essere dichiarato in ciascun 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();
    }
}
.

è un modo ragionevole di risolvere il problema?Sento che è un po 'pesante per qualcosa che avrei pensato sarebbe stato un problema comune.

È stato utile?

Soluzione

In generale è OK IMO. Ma per favore non lasciare che il fagiolo restituisca la connessione ma direttamente il DataSource. Alcuni appServers come WebSphere chiuderanno automaticamente la connessione quando il contesto del fagioli viene nuovamente lasciato.

Un'altra soluzione sarebbe quella di utilizzare @resource (nome="myds") anziché la ricerca. Se tutti i servlet sono in un'unica applicazione Web, è possibile definire una risorsa-ref with res-ref-name myds nel tuo web.xml e risolverlo al vero nome di ricerca solo in quel luogo.

Altri suggerimenti

Direi che usare un EJB solo per questo motivo potrebbe essere un po 'troppo pesante mentre scrivevi.

Prima la maggior parte dei moderni server di applicazioni cacheranno quella ricerca in modo che non sia così costoso.

Secondo - È possibile utilizzare @RESOURCE (NAME="MYDS") come ha detto Robert, che userebbe lo stesso riferimento di risorse, che può essere mappato al nome JNDI utilizzando le funzioni di mappatura del server delle applicazioni.

Terzo - è possibile utilizzare CDI per avere solo moduli Web Solution Seques:

Creazione di classe che tiene la definizione di datasource come questa:

public class Datasources {

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

e quindi utilizzare il servlet IT usando Inject:

public class MyServlet extends HttpServlet {
    @Inject 
    private DataSource myDs;   
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top