2009-05-04 7 views
7

Ich bin neu bei jboss und ich wurde gebeten, jboss Verbindung Pooling-Mechanismus mit einer bestehenden Web-Anwendung zu integrieren. Wenn man bedenkt, dass eine Webanwendungs-Datenbankschicht ordnungsgemäß geschrieben ist, d. H. Alle Ergebnissätze, Anweisungen und Verbindungen ordnungsgemäß geschlossen werden, wenn sie nicht benötigt werden, muss ich alle Codeänderungen in meiner Webanwendung vornehmen, nachdem ich die jboss-Datenquelle richtig konfiguriert habe.JBoss Datenbank Verbindungspool

Kann mir bitte jemand auf ein Tutorial oder ein Codebeispiel verweisen, das jboss datasource in einer Web-App verwendet.

+0

Konfigurieren von JBoss ein Teil des Deals ist, gibt es eine ganze Einige Beispiele und Tutorials online verfügbar. Was mich beschäftigt, sind die Änderungen, die möglicherweise in der Codebasis erforderlich sind. Kann jemand bitte mich auf eine Probe oder ein Tutorium verweisen, wo ich sehen kann, wie wir eine Verbindung von JBoss darasource abrufen und wie es später gehandhabt werden sollte, d. H. Die Verbindung schließen oder freigeben. Danke. –

Antwort

8

Der Pool in JBoss wird in der DataSource-Konfiguration behandelt. Here ist das HowTo. Die Webanwendung müsste eine JNDI-Suche nach der Datenquelle durchführen, um die Datenbankverbindung zu erhalten, anstatt eine direkte JDBC-URL zu erstellen, und dann wird ein Pooling durchgeführt.

Transaktionen sind eine andere Geschichte, obwohl.

EDIT: Als Antwort auf Ihren Kommentar darüber, wie dieser den Code betrifft, ist es das, was es sieht aus wie:

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(); 

Technisch den PortableRemoteObject.narrow sprechen in einer JBoss nicht erforderlich ist (4.2.2 sowieso) Single-Server-Konfiguration sicher, aber es ist mehr richtige J2EE-Standard-Code, da allgemeine Anwendungsserver nicht ein Objekt des richtigen Typs nur für eine Context.lookup zurückgeben müssen.

Das oben genannte behandelt nicht die Ressourcenauslastung und Fehlerbehandlungsprobleme. Sie sollten das Context-Objekt schließen, wenn Sie damit fertig sind, und natürlich die Datenbankverbindung, obwohl JBoss Sie anschreien wird, wenn Sie vergessen, die Datenbankverbindung zu schließen und die Transaktion endet, und sie für Sie zu schließen.

Wie auch immer, dieses Connection-Objekt ist genauso nutzbar wie DriverManager.getConnection (url);

1

Sie müssen nichts ändern. Wenn Sie die richtige Art von Datenquelle auswählen (local-tx-datasource/xa-datasource), ist die Verbindungsbehandlung und TX für Sie erledigt. In $ JBoss/docs/examples/jca finden Sie Vorlagen für praktisch jede Datenbank, die Sie einfach wiederverwenden können.

Wenn Sie XA verwenden, müssen Sie Tx-Recovery konfigurieren. Sehen Sie diesen Beitrag in einer Anleitung: http://management-platform.blogspot.com/2008/11/transaction-recovery-in-jbossas.html (gut, vielleicht nicht eine Anleitung im Standalone-Modus, aber in Verbindung mit dem Jopr-Quellcode).

9

zunächst eine XML-Datei mit Namen erstellen xxx-ds.xml und legen Sie diese Datei in 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> 

und jetzt in Ihrer .java Datei

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(); 

***** stellen Sie sicher, dass Ressource ref name in jedem Ort gleich sein sollten