Announcement

Collapse
No announcement yet.

STRUTS und DB Zugang

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • STRUTS und DB Zugang

    Hi newsgroup,

    bietet STRUTS auch fertige Klassen oder Interfaces zum Db Zugang, also inkl. exception handling, Zugang zu einem Connection Pool?

    Michael

  • #2
    Man kann in der struts-config eine DataSource definieren: http://struts.apache.org/userGuide/configuration.html#data-source_config

    Das geht allerdings genauso über JNDI, daher finde ich das Feature eigentlich unnötig :-) Die DataSource implementiert dann ev. einen Connection-Pool. Entweder ist beim JDBC-Treiber oder beim App-Server eine DataSource dabei oder man benutzt die BasicDataSource aus dem Apache DBCP Projekt, die auch einen Connection Pool bietet.

    Gruß,

    Alwi

    Comment


    • #3
      hallo,

      auch wenn das evtl. nicht direkt ein beitrag zum thema ist. ich weiß ja nicht ob ich richtig informiert bin, aber ist datasource nicht innerhalb des struts paketes überholt? könntest du deine jndi bemerkung etwas erweitern. würde mich nämlich auch interessieren.

      mf

      Comment


      • #4
        Hi,

        Es gab (ich glaube bis 1.1) in Struts eine GenericDataSource-Implementierung. Diese war glaube ich schon früher deprecated. Jetzt gibt es sie gar nicht mehr. Man wollte eben keine zwei DataSource-Implementierungen haben und in Apache DBCP gibt es ja sowieso eine, die auch außerhalb Struts Sinn macht. Das DataSource-Interface ist Teil von JDBC und ist natürlich nicht überholt :-)Die Tatsache, daß man DataSources in der struts-config definieren und über getDataSource holen kann, ist AFAIK nicht deprecated. Kann aber gut sein, das man das Feature nur aus Kompatibilitätsgründen noch in Struts drin hat.

        Ich habe den Sinn dieses Features angezweifelt, weil man in J2EE DataSources über JNDI holen kann (das ist halt der Standard). Wenn man die DataSource nicht über JNDI holt, ist sie auch nicht mit dem Transaktionsmanager assoziiert und man umgeht die Standardmechanismen des J2EE-Servers. Allerdings gibt es auch Server, die von Haus aus kein JNDI bieten (z.b. Jetty), aber da kann man es meist leicht nachrüsten.

        Gruß,

        Alwi

        Comment


        • #5
          hallo,

          das klingt sehr interessant. wo kann ich den eine kleine anleitung zu jndi finden. ist ja denk ich mal auch von apache/jakarta oder? ist das teil konfigurierbar, oder verwaltet es alles per def. über den transaktionsmanager

          Comment


          • #6
            Hi Jan,

            JNDI ist zunächst mal nur eine Spezifikation, die dann von Anbietern implementiert wird ( http://java.sun.com/products/jndi/ ).

            Ganz allgemein kann man über JNDI auf Resourcen und hierarchisch definierte Informationen über eine einheitliche Schnittstelle zugreifen. Man kann sich also z.b. eine DataSource holen ohne das die Anwendung wissen muß, was für eine Datenbank mit welcher Konfiguration dahinter hängt.

            In der Praxis muß man in XML-Dateien die Resourcen definieren, auf die man zugreifen möchte. Im Code kann man dann einen lookup machen, z.b. in der Art:

            <PRE>
            Context context= new InitialContext();
            DataSource datasource= (DataSource)context.lookup("java:/jdbc/MyDB");
            </PRE>

            Wie man die Resourcen definiert, ist von Server zu Server unterschiedlich. Das kann sehr einfach sein (wenn man nur einige Strings abfragen will) oder sehr komplex (Einbindung von bestehenden LDAP-Servern etc.). Du kannst Dir das ja mal am Beispiel vom Tomcat durchlesen http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-resources-howto.html .

            Das mit dem Transaktionsmanager war nur ein Beispiel. Der Server muß transaktionale Resourcen mit dem Transaktionsmanager assoziieren, damit er die Transaktion steuern kann. Dazu muß der Server die Resource aber erst mal kennen. Das ist normalerweise nur dann der Fall, wenn man sie über den Standard-Weg (eben JNDI) definiert und holt. Mit dem Transaktionsmanager hat JNDI ansonsten nichts zu tun. Der Tomcat hat z.b. überhaupt keinen Transaktionsmanager aber eine (read-only) JNDI-Implementierung.

            Gruß,

            Alwi

            Comment


            • #7
              schönen dank, da werd ich mich mal schlau machen. dank dir

              Comment


              • #8
                Hallo,

                Frage zum Thema JNDI:

                ich möchte den JNDI-lookup nicht fest in die Klasse coden - wie mache ich das anders? Einlesen per configFile? Ich möchte mir eben eine Klasse schreiben, mit deren Hilfe ein Servlet die Verbindung zur DB aufbaut, statement absetzt, resultSet bekommt, anschließend Verbindung wieder schließt. Und dabei wäre es toll, wenn der Lookup Name nicht fest im code stünde

                Michae

                Comment


                • #9
                  Kommt drauf an wieviel Mühe Du Dir machen willst. Ich schreibe die JNDI-Namen immer als Konstanten in ein Interface (zumal XDoclet das mit EJB-Namen auch so macht). Du kannst natürlich auch ein property-File machen, halte ich allerdings für nicht nötig. Wenn man einen ServiceLocator ( http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html ) für die JNDI-lookups hat, kann man die Namen ja auch da mit reinbauen und die Resourcen über Java-Methoden direkt holen.

                  Da JNDI-Name ja sowieso schon logische Resource-Namen sind und man für einzelne Komponenten (WebApps, EJBs) ja auch noch mal extra einen logischen Namen (JNDI ENC) auf den globalen JNDI-Namen mappen kann, würde ich mir nicht die Mühe machen, nochmal ein config file zu basteln, ist schon kompliziert genug :-)

                  Gruß,

                  Alwi

                  Comment


                  • #10
                    Hallo Alwin<br><br>

                    >Ich schreibe die JNDI-Namen immer als Konstanten in ein Interface

                    <br>
                    Wie kann ich mir das vorstellen?<br>
                    Also du machst nen "public interface testInterface" und schreibst dort String Konstanten rein mit den JNDI Namen. Dann baust eine Klasse zum DB Zugang bzw. Abfrage, die das Interface implementiert?
                    <br><br>
                    Danke für die Info, Michae

                    Comment


                    • #11
                      So zum Beispiel:

                      <PRE>
                      public interface JNDIConstants
                      {
                      public static final String DB2_ENC_DS = "java:comp/env/jdbc/DB2DS";
                      }
                      </PRE>
                      <PRE>
                      DataSource ds = ServiceLocator.getInstance().lookupDataSource(JNDI Constants.DB2_ENC_DS);
                      <PRE>

                      oder alternativ (der ServiceLocator nutzt den Namen intern):
                      <PRE>
                      DataSource ds = ServiceLocator.getInstance().lookupDB2DataSource() ;
                      <PRE>

                      Du siehst, keine Hexerei :-)

                      Gruß,

                      Alwi

                      Comment

                      Working...
                      X