2013-03-04 15 views
5

Costruisco un'applicazione con un livello "core" standalone, che è anche usato per costruire una webapp (è un progetto multi-modulo Maven, con un modulo 'core' e un modulo 'webapp', che ha un dipendenza dal modulo 'core'). Usa un database MySQL. Io cerco di implementare un DataSource che sarebbe bene in entrambi i contesti (solo 1 collegamento è sufficiente nel contesto standalone).Quale DataSource per l'applicazione utilizzata sia in stand-alone e contesto webapp (Java 7, Tomcat 7)?

Dopo aver letto un sacco di documenti su DataSource, devo dire che sono un po 'perso. Sono giunto alla conclusione che forse dovrei usare lo Tomcat JDBC Connection Pool. Le mie domande sono:

1) nel contesto standalone, come dovrei fornire la configurazione per utilizzare il DataSource, sapendo che questa configurazione verrà fornita da Tomcat nel contesto webapp (la configurazione autonoma non dovrebbe quindi sovrascrivere la configurazione di Tomcat)?

  • Devo fare qualcosa di simile in this other question in un metodo chiamato solo nel contesto standalone? Ma come posso vedere nel contesto webapp che Tomcat ha già fornito DataSource?

  • Oppure devo usare una definizione di bean? Ma come questo bean non verrebbe utilizzato nel contesto webapp?

2) E altre implementazioni di DataSource in pool?

Conclusione: Sì, mi sono perso, e non so che cosa sono i "gold standard" per l'utilizzo DataSource. Grazie per l'aiuto.

risposta

2

È possibile cercare il DataSource nel modulo principale. È necessario creare lo JNDI Datasource in Tomcat per il modulo webapp e lo Standalone JNDI support per il modulo standalone.

ad es. Per ottenere il Connection da origine dati è la stessa in entrambi contesto:

Context ctx = new InitialContext(); 
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB"); 
Connection conn = ds.getConnection(); 

Ma la configurazione di origine dati è spettacolo diverso. In Tomcat vedrai qualcosa di simile negli esempi nei link.

<Context> 
<Resource name="jdbc/MySQLDB" ... /> 
</Context> 

Il nome della risorsa nella standalone deve essere lei stessa come la ctx.lookup chiamata in standalone: ​​

Properties prop = new Properties(); 
prop.put("java:comp/env/jdbc/MySQLDB", ds1); 

Il InitialContextFactory nel modulo autonomo deve essere creato indipendentemente modulo di base.

Informazioni su com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource vedere this.Tomcat utilizza le librerie DBCP della Apache Software Foundation, che si può anche utilizzare nel codice proprio non-Java EE: http://jakarta.apache.org/commons/dbcp/

per JDBC Connection Pool in Tomcat vedere this e per Apache DBCP Pool vedere this.

+0

Grazie per la risposta, alcune domande: il mio livello 'core' è una libreria che può essere utilizzata in altre applicazioni. Se non voglio che queste applicazioni eseguano le attività descritte nel tuo secondo link, InitialContext dovrebbe essere impostato ** all'interno ** del livello principale, giusto? Quindi forse dovrei eseguire più semplicemente la ricerca nel livello principale, catturare l'eccezione generata se non in un contesto webapp, quindi impostare la mia connessione in quel caso? Sarebbe valido? – FBB

+0

Se il 'core' contiene tale funzionalità, che potrebbe essere eseguita da altre applicazioni. È possibile generare un terzo componente (con il custom 'InitialContextFactory') che potrebbe essere chiamato dall'applicazione standalone. Penso che questa funzionalità dei requisiti possa essere unica per l'applicazione standalone, quindi potresti incorporarla in un'applicazione del genere. In un'altra mano, potresti implementare un factory di connessione. –

+0

Sì, solo un semplice factory di connessione che utilizza un DriverManager quando il DataSource non può essere caricato utilizzando JNDI. Il driver può essere configurato tramite un file di proprietà. Sarebbe valido? Os è un modello di disegno terribile? : p – FBB