23 Stimmen

Gibt es eine Standardmethode zur Definition einer JDBC-Datenquelle für Java EE-Container?

Ich weiß, dass Sie für JBoss eine [name]-ds.xml-Datei im Unterverzeichnis /deploy der entsprechenden Instanz benötigen. Ich habe keine Erfahrung mit anderen Java EE-Containern, aber ich versuche, mich so weit wie möglich an Standards zu halten. Gibt es eine Standardmethode, um eine JDBC-Datenquelle zu definieren und sie bereitzustellen? Wenn möglich, möchte ich meine Datenquelle in die *.ear-Datei einbinden (z. B. eine eingebettete In-Memory-HSQLDB-Datenquelle für Demozwecke)?

Wenn es keine Standardmethode gibt, werden andere Container zumindest die Jboss-Methode akzeptieren? (/deploy/*-ds.xml)

30voto

Arjan Tijms Punkte 37226

Gibt es eine Standardmethode, um eine JDBC-Datenquelle zu definieren und sie einzusetzen?

Ja, die gibt es. Sie erfolgt über die <data-source> Element, das Sie in web.xml , ejb-jar.xml y application.xml . Wenn Sie XML nicht mögen, können Sie stattdessen auch eine Annotation verwenden: @DataSourceDefinition

Beispiel für einen web.xml-Eintrag

<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>

Lesen Sie weiter:

p.s. Ich bin überrascht, dass alle anderen Antworten besagen, dass es so etwas nicht gibt, obwohl es eindeutig existiert, sogar zu der Zeit, als diese Frage ursprünglich gestellt wurde.

3voto

Pascal Thivent Punkte 548176

Gibt es eine Standardmethode, um eine JDBC-Datenquelle zu definieren und sie einzusetzen?

Nein, das ist containerspezifisch. Wie Anbieter von Anwendungskomponenten sollen Sie die benötigten Ressourcen und die Anwendungsentwickler und Administrator werden sie konfiguriert.

Wenn es keine Standardmethode gibt, werden andere Container dann wenigstens die JBoss-Methode akzeptieren?

Nein, denn dies ist die JBoss-Methode und somit JBoss-spezifisch.

  • Mit Tomcat müssten Sie die context.xml Datei.
  • Mit Jetty, jetty-env.xml .
  • Mit WebSphere können Sie eine so genannte WebSphere Enhanced EAR .
  • Mit WebLogic können Sie ein Paket JDBC-Modul in Ihrer Bewerbung.
  • Mit GlassFish können Sie den Befehl asadmin add-resources my.xml um eine in einer XML-Datei beschriebene Datenquelle hinzuzufügen (Beispiel aquí ).
  • Und so weiter und so fort.

Beachten Sie, dass es einige Projekte gibt, die versuchen, dieses Ziel auf universelle Weise zu erreichen, wie jndi-Ressourcen o Fracht . Es gibt auch komplexere Lösungen wie KontrolleTier o Chefkoch .

Nun, in Ihrem Fall (so wie ich es verstanden habe, möchten Sie eine eingebettete Datenbank verwenden, die mit Ihrer Anwendung gebündelt wird), denke ich nicht, dass Sie eine Datenquelle auf der Ebene des Anwendungsservers konfigurieren sollten. Sie sollten einfach das Jar Ihrer Datenbank in Ihrer Anwendung mit einem eigenständigen Verbindungspool wie c3p0 oder DBCP verpacken.

1voto

Sean Owen Punkte 64909

Die Java EE-Philosophie von Sun definiert mehrere Rollen bei der Konzeption, Entwicklung und Bereitstellung einer Unternehmensanwendung. Das Design von Java EE berücksichtigt und reflektiert diese Aufteilung der Belange.

Sun will insbesondere den Entwickler vom Administrator einer Anwendung trennen, was eine gute Idee ist. Der Entwickler schreibt Unternehmenskomponenten auf eine container-agnostische Weise. In web.xml deklarieren Sie zum Beispiel Ihre DataSources auf eine standardisierte Weise:

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

Dies besagt: "Diese Datenbank, die die Anwendung benötigt, muss mir zur Verfügung gestellt werden, unabhängig von der Datenbank und dem Container, in dem sie ausgeführt wird, über Standard-JNDI unter 'jdbc/myDB'". Das ist alles, was der Entwickler tun kann - der Rest ist notwendigerweise containerspezifisch und daher nicht standardisiert.

Wie "myDB" dann tatsächlich konfiguriert wird, hängt von einer anderen Rolle ab, nämlich der des Administrators des Containers.

Ich wiederhole also die richtige Antwort von oben: Nein. Der Grund dafür ist, dass Sie sonst Ihre Anwendung für einen bestimmten Datenbanktyp auf einem bestimmten Host und Port kodieren müssten, und der Punkt ist, dass Sie dazu nicht in der Lage sein sollten, also gibt es absichtlich keine Standardunterstützung dafür.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X