2010-02-17 10 views
19

So che per JBoss è necessario un file [nome] -ds.xml nella sottodirectory/deploy dell'istanza appropriata. Non ho esperienza con altri contenitori Java EE, ma sto cercando di rispettare gli standard il più possibile. esiste un modo standard per definire un'origine dati JDBC e distribuirla? se possibile vorrei includere la mia origine dati all'interno del file * .ear (ad esempio, un'origine dati HSQLDB in-memory incorporata per scopi dimostrativi)?esiste un modo standard per definire un'origine dati JDBC per contenitori Java EE?

se non esiste un modo standard, gli altri container accettano almeno il modo jboss? (/deploy/*-ds.xml)

risposta

21

Esiste un modo standard per definire un'origine dati JDBC e distribuirla?

Sì, c'è. Viene eseguito tramite l'elemento <data-source>, che è possibile inserire in web.xml, ejb-jar.xml e application.xml. Se non ti piace XML, è possibile utilizzare anche un'annotazione per questo, invece: @DataSourceDefinition

Esempio di una voce web.xml

<data-source> 
    <name>java:app/myDS</name> 
    <class-name>org.postgresql.xa.PGXADataSource</class-name> 
    <server-name>pg.myserver.com</server-name> 
    <database-name>my_db</database-name> 
    <user>foo</user> 
    <password>bla</password> 
    <transactional>true</transactional> 
    <isolation-level>TRANSACTION_READ_COMMITTED</isolation-level> 
    <initial-pool-size>2</initial-pool-size> 
    <max-pool-size>10</max-pool-size> 
    <min-pool-size>5</min-pool-size> 
    <max-statements>0</max-statements> 
</data-source> 

Ulteriori approfondimenti:

p.s. Sono sorpreso che tutte le altre risposte affermino che questo non esiste, mentre chiaramente lo fa, anche nel momento in cui questa domanda è stata inizialmente posta.

+0

La domanda riguardava la configurazione specifica del contenitore, credo? Come http://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Connectors_on_JBoss-Configuring_JDBC_DataSources.html Questo non è l'equivalente se capisco correttamente la domanda. Ma sì, hai ragione, questa è la risposta giusta per il 90% dei casi - era un po 'di mesi all'epoca in cui questo era stato chiesto e di sicuro non lo sapevo! –

+1

@SeanOwen> "La domanda riguardava la configurazione specifica del contenitore, credo" - penso che Op abbia chiesto un modo standard per qualcosa che altrimenti potrebbe essere fatto tramite la configurazione specifica del contenitore. Sono d'accordo sul fatto che all'epoca questo meccanismo avesse solo pochi mesi e che i vari venditori non ne facessero molto rumore. –

+0

yup, OP cercava sicuramente qualcosa del genere :-) grazie mille Arjan. significa che ho bisogno di andare con la distribuzione esplosa per rendere la configurazione facilmente accessibile agli script/strumenti, ma è un'opzione molto valida. se guardi la data però, stavo guardando ~ 2010 così j2ee6 non era davvero un'opzione. – radai

0

La filosofia Java EE di Sun definisce diversi ruoli nella progettazione, sviluppo e distribuzione di un'applicazione aziendale. Il design Java EE accoglie e riflette queste separazioni di preoccupazioni.

In particolare, Sun desidera separare lo sviluppatore dall'amministratore di un'applicazione, che è una buona idea. Lo sviluppatore scrive i componenti aziendali in modo indipendente dal contenitore. In web.xml, per esempio, che non dichiarano le DataSources in modo standard:

<resource-ref> 
<res-ref-name>jdbc/myDB</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 
</resource-ref> 

Questo dice "questo database cosa le esigenze applicative, renderlo disponibile a me, qualunque banca dati è e qualunque contenitore che si sta eseguendolo, tramite JNDI standard a 'jdbc/myDB' ". Questo è quanto lo sviluppatore può fare - il resto è necessariamente specifico del contenitore e quindi non standardizzato.

E quindi il modo in cui "myDB" è effettivamente configurato è fino a un ruolo diverso, l'amministratore del contenitore.

Quindi sto ripetendo la risposta corretta sopra: no. Ma la ragione è, altrimenti, dovresti codificare la tua app su un tipo specifico di database su uno specifico host e porta, e il punto è che non dovresti essere in grado di farlo, quindi non c'è un supporto standard per quello su scopo.

+0

mentre hai ragione per il caso generale, nel mio caso ho intenzione di utilizzare un DB-JVM, in-memory, con Hibernate in cima (pensare ad esso come una cache Object) - qualcosa che speravo potesse fatto in modo portatile – radai

+1

> che è una buona idea - è una buona idea per alcuni casi d'uso, ma non per tutti i casi d'uso. Java EE 6 ha iniziato a fornire alternative (ad es. È possibile definire un'origine dati dall'app) e Java EE 7 ha continuato questa tendenza (cose come le destinazioni JMS e le sessioni di posta possono essere definite anche dall'app). –

+1

> non dovresti essere in grado di farlo - Le specifiche non dovrebbero imporre un unico modo di lavorare. Questa spiegazione non tiene completamente conto dell'esistenza di database locali, privati ​​(possibilmente in memoria) e non si riduce alle app più semplici. Interfacce e moduli separati per la logica di business potrebbero essere stati una buona pratica per alcuni casi d'uso, ma farli rispettare renderebbe l'EJB un peso notevole. Da Java EE 6 in poi, la scelta spetta allo sviluppatore (le interfacce e un modulo EJB separato sono opzionali ora). –

5

Esiste un modo standard per definire un'origine dati JDBC e distribuirla?

No, questo è specifico del contenitore. Come Application Component Provider, devi documentare le risorse di cui hai bisogno e il Application deployer and Administrator le configurerà.

Se non esiste un modo standard, gli altri container accettano almeno il modo JBoss?

No, perché questo è il modo JBoss e quindi specifico per JBoss.

  • Con Tomcat, è necessario utilizzare il file context.xml.
  • Con Jetty, jetty-env.xml.
  • Con WebSphere, è possibile creare un cosiddetto WebSphere Enhanced EAR.
  • Con WebLogic, è possibile impacchettare un JDBC Module nell'applicazione.
  • Con GlassFish, è possibile utilizzare il comando asadmin add-resources my.xml per aggiungere un'origine dati descritta in un file XML (esempio here).
  • ecc. Ecc.

Nota che ci sono alcuni progetti che cercano di raggiungere questo obiettivo in modo universale come jndi-resources o Cargo. Ci sono anche soluzioni più complesse come ControlTier o Chef.

Ora, nel tuo caso (come ho capito, vuoi utilizzare un database incorporato che verrà fornito in bundle con la tua applicazione), non penso che dovresti configurare un'origine dati a livello del server delle applicazioni. Dovresti semplicemente impacchettare il jar del tuo database nella tua applicazione con un pool di connessione standalone come c3p0 o DBCP.

+1

> questo è specifico del contenitore. - No, non è necessariamente specifico del contenitore. Esiste anche un metodo standard che utilizza l'elemento '' ad es. web.xml (vedi la mia risposta sotto). –

Problemi correlati