2009-05-04 15 views
7

Sono un neofita di jboss e mi è stato chiesto di incorporare il meccanismo di pooling delle connessioni jboss con un'applicazione web esistente. Considerando che uno strato di database di applicazioni Web è scritto correttamente, vale a dire tutti i set di risultati, le istruzioni e le connessioni vengono chiuse correttamente quando non necessario, Quali modifiche di codice dovrò apportare nella mia app Web dopo aver configurato correttamente l'origine dati jboss.Pool di connessione del database JBoss

Qualcuno può per favore mi punto ad un tutorial o un esempio di codice che utilizza JBoss origine dati in una web app.

+0

Configurare JBoss è una parte del gioco, ci sono un bel alcuni esempi e tutorial disponibili online. Quello che mi interessa sono le modifiche che potrebbero essere richieste nel codice di base. Qualcuno può indicarmi un esempio o un'esercitazione in cui posso vedere come recuperare una connessione da JBoss darasource e come dovrebbe essere gestita in un secondo momento, ovvero chiudere o liberare la connessione. Grazie. –

risposta

8

Il pool in JBoss viene gestito nella configurazione DataSource. Here è il HowTo. L'app Web dovrebbe eseguire una ricerca JNDI per l'origine dati per ottenere la connessione al database anziché eseguire un URL JDBC diretto e quindi si avrà il pooling.

Le transazioni sono un'altra storia, però.

EDIT: In risposta al tuo commento su come questo influisce il codice, questo è ciò che sembra:

String jndiPath = "java:DataSourceJNDIName"; //The exact prefix here has a lot to do with clustering, etc., but if you are using one JBoss instance standalone, this works. 
Context ctx = new InitialContext(); 
DataSource ds = (DataSource) PortableRemoteObject.narrow(ctx.lookup(jndiPath), DataSource.class); 
Connection c = ds.getConnection(); 

Tecnicamente parlando il PortableRemoteObject.narrow non è necessaria in un JBoss (4.2.2 in ogni caso) Configurazione del server singolo, ma è più corretto il codice standard J2EE, in quanto i server di applicazioni generali non devono restituire un oggetto del tipo giusto solo per fare un Context.lookup.

È possibile che questo non copre i problemi di utilizzo delle risorse e la gestione degli errori. Dovresti chiudere quell'oggetto Context quando hai finito, e naturalmente la connessione al database, anche se JBoss ti urlerà se ti dimentichi di chiudere la connessione al database e la transazione finisce, e chiudila per te.

In ogni caso, l'oggetto Connection è utilizzabile tanto quanto DriverManager.getConnection (url);

1

Non è necessario modificare nulla. Quando si seleziona il tipo corretto di origine dati (local-tx-datasource/xa-datasource), la gestione della connessione e il TX vengono eseguiti automaticamente. In $ JBoss/docs/examples/jca troverai i modelli per praticamente tutti i database, che puoi riutilizzare.

Se si utilizza XA, è necessario configurare Tx-recupero. Vedi questo post su un how-to: http://management-platform.blogspot.com/2008/11/transaction-recovery-in-jbossas.html (beh, forse non un how-to in modalità standalone, ma in combinazione con il codice sorgente Jopr).

9

prima creare un file xml per nome xxx-ds.xml e posizionare il file nella server/default/deploy/xxx-ds.xml

<datasources> 
<local-tx-datasource> 
<jndi-name>/jdbc/Exp</jndi-name> 
<type-mapping>SQL</type-mapping> 
<connection-url>jdbc:microsoft:sqlserver://   </connection-url> 
<driver-class>com.microsoft.jdbc.sqlserver.SQLServerDriver</driver-class> 
<user-name></user-name> 
<password></password> 
<min-pool-size>5</min-pool-size> 
<max-pool-size>1000</max-pool-size> 
</local-tx-datasource> 
</datasources> 

jboss-web.xml

<jboss-web> 
<!-- <security-domain flushOnSessionInvalidation="false"/>--> 
<!-- <context-root>/BSI</context-root>--> 
    <resource-ref> 
     <description>Database connection resource</description> 
     <res-ref-name>jdbc/Exp</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <jndi-name>java:/jdbc/Exp</jndi-name> 
     <res-auth>Container</res-auth> 
    </resource-ref> 
</jboss-web> 

web.xml

<resource-ref> 
    <description>Database connection resource</description> 
    <res-ref-name>jdbc/Exp</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

e ora nel file .java

javax.naming.Context ctx1 = new javax.naming.InitialContext(); 
javax.sql.DataSource ds = (javax.sql.DataSource) ctx1.lookup("java:comp/env/jdbc/Exp"); 
con = ds.getConnection(); 

***** fare in modo che il nome della risorsa ref dovrebbe essere lo stesso in tutto il posto

Problemi correlati