# Tomcat + ConnectionPool + ODBC



## bronks (30. Aug 2005)

Hi!

Mit einem Tomcat 5.5.7 wollte ich einen ConnectionPool über ODBC aufbauen. Von JNDI-Namen nicht gefunden bis no suitable Driver habe ich, je nach Testfall, alles mögliche zu lesen bekommen. Dadurch läßt sich das Problem nicht eindeutig erkennen.

Funktioniert das überhaupt sich einen ConnectionPool aus einer ODBC-Verbindung zusammenzubauen oder muß ich den Fehler anderswo suchen?

Danke!

Bronks


----------



## Bleiglanz (31. Aug 2005)

warum sollte das nicht funktionieren?


----------



## bronks (1. Sep 2005)

Bleiglanz hat gesagt.:
			
		

> warum sollte das nicht funktionieren?


Weiß nicht. Es funktioniert ohne erkennbaren Grund einfach nicht.


----------



## Bleiglanz (2. Sep 2005)

und mit welcher Fehlermeldung?

wie sieht die server.xml aus? der <context>? die web.xml? usw.


----------



## bronks (4. Sep 2005)

@Bleiglanz:
Es funktioniert. Allerdings kann ich jetzt nicht mehr nachvollziehen, warum es vorher nicht funktioniert hat. Auf jeden Fall hat mir Deine erste Aussage schon mal beigebracht, daß es funktionieren müßte ... Danke!


----------



## bronks (11. Sep 2005)

Nein! Es funktioniert doch nicht!

Auf Tomcat 5.5.7 funktioniert es einwandfrei, aber auf einem Tomcat 4.1.27 erhalte ich folgenden Fehler: *Cannot load Driver class 'null'*. Auf dem 4.1.31er habe ich es gerade auch gestet und da kommt: *Cannot create JDBC driver from Class '' for  connect URL 'null', cause: No suitable Driver.*

Kann mir bitte jemand einen Tip geben, warum der 4.1.xer diesen Fehler bringt und vorallem, was ich dagegen tun kann? 

Danke!


Context.xml:

```
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ConnectionPoolTestOdbc">

<Resource name="jdbc/OdbcDS" auth="Container"
	factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" 
          type="javax.sql.DataSource" driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"
          url="jdbc:odbc:Datenbank"
          username="user" password="password" maxActive="20" maxIdle="10" maxWait="-1" 
 removeAbandoned="true" 
logAbandoned="true" removeAbandonedTimeout="300"/>
</Context>
```

Auszug aus der web.xml:

```
...
  <resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/OdbcDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
...
```


Der Code der darauf zugreift:

```
...
            javax.naming.Context c = new javax.naming.InitialContext();
            dataSource = (javax.sql.DataSource) c.lookup("java:comp/env/jdbc/OdbcDS");
            
            Connection conn = null;

            
            conn = dataSource.getConnection();
...
```


----------



## KSG9|sebastian (11. Sep 2005)

Treiber unter shared/lib  kopiert?


----------



## bronks (11. Sep 2005)

KSG9|sebastian hat gesagt.:
			
		

> Treiber unter shared/lib  kopiert?


Eigentlich nicht. Der ODBC-Treiber ist doch in der rt.jar drin. Muß ich den noch irgendwie speziell einbinden?


----------



## Bleiglanz (12. Sep 2005)

unter dem 4er gibt es die komfortable Syntax für das <Ressource> Element noch nicht

da gibts  extra <Ressourceparams>

schau mal in die Doku!


----------



## bronks (12. Sep 2005)

Bleiglanz hat gesagt.:
			
		

> ... <Ressourceparams> ...


Danke für den Hinweis.

Hab die context.xml jetzt umgebaut. Jetzt funktioniert es nicht einmal mehr mit dem Tomcat5. Die Fehlermeldung ist die gleiche. Habe mich an der ApacheDoku orientiert. Mehrmals habe ich meine context.xml mit der Doku verglichen, aber es klappt nicht.

Was ist in dieser context.xml verkehrt.

```
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ConnectionPoolTestOdbc" docBase="ConnectionPoolTestOdbc">

  <Resource name="jdbc/OdbcDS"
                 auth="Container"
                 type="javax.sql.DataSource"/>
  
    <ResourceParams name="jdbc/OdbcDS">
      <parameter>
        <name>factory</name>
        <value>
            org.apache.commons.dbcp.BasicDataSourceFactory
        </value>
      </parameter>

    <parameter>
      <name>maxActive</name>
      <value>100</value>
    </parameter>

    <parameter>
      <name>maxIdle</name>
      <value>5</value>
    </parameter>

    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>

    <parameter>
     <name>username</name>
     <value>bronks</value>
    </parameter>
    
    <parameter>
     <name>password</name>
     <value>passwort</value>
    </parameter>

    <parameter>
       <name>driverClassName</name>
       <value>
         sun.jdbc.odbc.JdbcOdbcDriver
       </value>
    </parameter>

    <parameter>
      <name>url</name>
      <value>
        jdbc:odbc:Datenbank
      </value>
    </parameter>

    <parameter>
        <name>removeAbandoned</name>
        <value>true</value>
    </parameter> 

    <parameter>
        <name>removeAbandonedTimeout</name>
        <value>300</value>
    </parameter>    

    <parameter>
        <name>logAbandoned</name>
        <value>true</value>
    </parameter>   
                
  </ResourceParams>

</Context>
```


----------



## krey (12. Sep 2005)

Hi, also ich habe das gleiche Problem! Auch die Fehlermeldung


```
javax.servlet.ServletException: Cannot create JDBC driver of class '' for connect URL 'null' [...]
Caused by: java.sql.SQLException: No suitable driver
        at java.sql.DriverManager.getDriver(DriverManager.java:243) [...]
```
Mhh also es scheint daran zu liegen dass der Treiber nicht geladen wird!

Vieleicht liegt es ja am Tomcat release? Ich habe 5.5.9 

Meine server.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<Server>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
  <GlobalNamingResources>
    <Environment
      name="simpleValue"
      type="java.lang.Integer"
      value="30"/>
    <Resource
      auth="Container"
      description="User database that can be updated and saved"
      name="UserDatabase"
      type="org.apache.catalina.UserDatabase"
      pathname="conf/tomcat-users.xml"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"/>
    <Resource
      auth="Container"
      name="jdbc/postgres"
      type="javax.sql.DataSource"
      driverClassName="org.postgresql.Driver"
      password="....."
      maxIdle="10"
      maxWait="-1"
      username="user"
      url="jdbc:postgresql://0.0.0.0:5432/user"
      maxActive="20"/>
  </GlobalNamingResources>
  <Service
      name="Catalina">
    <Connector
        port="8080"
        redirectPort="8443"
        minSpareThreads="25"
        connectionTimeout="20000"
        maxThreads="150"
        maxSpareThreads="75"
        maxHttpHeaderSize="8192">
    </Connector>
<Connector
        port="8009"
        redirectPort="8443"
        protocol="AJP/1.3">
    </Connector>
    <Engine
        defaultHost="localhost"
        name="Catalina">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
      <Host
          appBase="webapps"
          name="localhost">
      </Host>
    </Engine>
  </Service>
</Server>
```

Eintrag in meiner web.xml


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

Muss denn sonst noch etwas modifiziert werden?

Also am security manager liegt es auch nicht, den hab ich eh zu testzwecken rausgenommen.

Das admin Tool hat noch einen Eintrag in der Datei conf/Catalina/localhost/krey.xml gemacht und zwar:


```
<?xml version="1.0" encoding="UTF-8"?>
<Context
    docBase="/home/krey/public_html/jsp"
    privileged="true">
  <Resource
    auth="Container"
    name="jdbc/postgres"
    type="javax.sql.DataSource"/>
  <ResourceLink
    global="jdbc/postgresql"
    name="jdbc/postgresql"
    type="javax.sql.DataSource"/>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
```

Wieso sind da so viele WatchedResource ´s? Wird nicht nur eine gebraucht?

Helft mir mal bitte, ich komme hier garnicht mehr klar! Versuche dass schon seit Tagen dass zum laufen zu bringen ...

Als Treiber habe ich den zu der Datenbank passenden und auch so funktionierenden "pg73jdbc2ee.jar" ! Direktes Verbingen u.s.w. funktioniert ohne Probleme! Nur die Sache mit Tomcat  *grrrrrr*

Schonmal vielen Dank!

Grüße, Martin


----------



## krey (13. Sep 2005)

Juchu, ich habe den Fehler gefunden! Also beim neuen Tomcat werden die Ressoruce Einträge in der server.xml ignoriert. Es gibt eine andere Konfigurationsdatei... mhh wie hieß die gleich. Ahh context.xml! Schreib da mal die Ressource rein. Danach musst du nurnoch den Security Manager anpassen. Wenn ich wieder an dem anderen Computer bin, kann ich dir bei bedarf einen Auszug aus der Datei schicken. Wenn du´s noch brauchst schick mir einfach ne pm.


----------



## bronks (13. Sep 2005)

krey hat gesagt.:
			
		

> Juchu, ich habe den Fehler gefunden! ...


Ich hab mir jetzt den 5.5.9er runtergeladen, nach dem ich das 5.5.11er AlphaRelease innerhalb weniger sekunden total zerlegt hab. 

Ich habe im Admintool einen DBCP angelegt. In die context.xml den ResourceLink und in die web.xml den RessourceRef reingeschrieben: Klappt auf anhieb. Der vom Admintool erzeugte Code schaut genauso aus, wie das was ich oben geschrieben habe, nur daß er es in die server.xml geschrieben hat. 

Wenn ich auf dem 4.1.27er das auch mit dem Admintool mach, dann funktioniert rein garnichts ... und wenn ich es per Hand mache, wie oben, dann geht auch nichts ...


----------

