# MySQL Connection Pool nach Apache Example



## freez (29. Mai 2007)

Hallo,

ich versuche gerade einen Datenbankverbindungspool zu einer MySQL Datenbank aufzubauen. Ursprünglich wollte ich eine jsf DataTable mit Daten füllen. Aber als es nicht geklappt hat, habe ich das Example von Apache durchgespielt: tomcat.apache.org/tomcat-5.0-doc/jndi-datasource-examples-howto.html

Also, was habe ich gemacht:
- aktuelle mysql connector Jar File in commons/lib Verzeichniss von Tomcat abgelegt (ich habe auch einen Test mit WebInf/lib durchgespielt)
- server.xml bearbeitet: im Host Tag habe ich den Example Context Tag von der Apache Seite reinkopiert; Den URL Parameter habe ich dann meinen Bedürnissen angepasst
- In Eclipse ein Projekt für die /TestDB Applikation erstellt und jstl Libs eingefügt
- die web.xml mit den Daten aus der Apache Seite erweitert (copy & paste)
- eine index.jsp erstellt, wie bei Apache Seite angegeben (copy & paste) und SQL Befehl meinen Bedürfnissen angepasst

Nun ja, laut example sollte das reichen. das Ergebniss:



```
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'"
	at org.apache.taglibs.standard.tag.common.sql.QueryTagSupport.getConnection(QueryTagSupport.java:276)
	at org.apache.taglibs.standard.tag.common.sql.QueryTagSupport.doStartTag(QueryTagSupport.java:159)
	at org.apache.jsp.index_jsp._jspx_meth_sql_query_0(index_jsp.java:102)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:60)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:833)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1285)
	at java.lang.Thread.run(Unknown Source)
```

Mich verwirrt vor allem die Zeile: 
	
	
	
	





```
Cannot create JDBC driver of class '' for connect URL 'null'"
```

Treiber ist in dem commons/lib Ordner. Und einen Test mit dem web-inf/lib habe ich auch gemacht. Username und Paswort für die DB passen. Standard Installation MySQL ("root" ohne PWD). In der JSP verwende ich die Datenbank test mit der Tabelle test. Diese existieren auch.

Der Vollständigkeit halber hier die wichtigsten Daten:

server.xml mit der Deklaration des Pools im Host Tag:

```
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
  <GlobalNamingResources>
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      <Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
	<Context path="/DBTest" docBase="DBTest"
	        debug="5" reloadable="true" crossContext="true">
	
	  <Logger className="org.apache.catalina.logger.FileLogger"
	             prefix="localhost_DBTest_log." suffix=".txt"
	             timestamp="true"/>
	
	  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"/>
	  <ResourceParams name="jdbc/TestDB">
          <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>30</value></parameter>
	    <parameter><name>maxWait</name><value>10000</value></parameter>
	    <parameter><name>username</name><value>root</value></parameter>
	    <parameter><name>password</name><value></value></parameter>
	    <parameter><name>driverClassName</name><value>com.mysql.jdbc.Driver</value></parameter>
	    <parameter><name>url</name><value>jdbc:mysql://localhost:3306/test?autoReconnect=true</value></parameter>
	  </ResourceParams>
	</Context>
      </Host>
    </Engine>
  </Service>
</Server>
```

Web.xml mit der Deklaration der Ressourcen:

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	  <description>MySQL Test App</description>
          <resource-ref>
                 <description>DB Connection</description>
                 <res-ref-name>jdbc/TestDB</res-ref-name>
                 <res-type>javax.sql.DataSource</res-type>
                 <res-auth>Container</res-auth>
          </resource-ref>
</web-app>
```

die index.jsp


```
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/TestDB">
select name, vorname, birthday from test
</sql:query>

<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>

  <h2>Results</h2>
  
<c:forEach var="row" items="${rs.rows}">
    name ${row.name}

    vorname ${row.vorname}

    birthday ${row.birthday}

</c:forEach>

  </body>
</html>
```

Habe ich hier was vergessen? Fehlt mir was? Was habe ich übersehen?


----------



## freez (29. Mai 2007)

Ich habe eine Lösung gefunden. Warum es so funktioniert aber anders herum nicht, weiß ich nicht. Jedenfalls habe ich einen Context Block im Internet gefunden, den ich in eine xml Datei gepackt habe, welche im conf/catalina/localhost ordner gespeichert habe:


```
<Context path="/mysqltest" debug="5" reloadable="true" crossContext="true">
	<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_mysqltest_log." suffix=".txt" timestamp="true"/>
	<Resource name="jdbc/mysqltest" auth="Container" type="javax.sql.DataSource" removeAbandoned="true" removeAbandonedTimeout="30"
	maxActive="50" maxIdle="20" maxWait="10000" username="root" password="" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test"/>
</Context>
```

Das funzt nun auch mit meiner JSF Application /mysqltest. Kann mir jemand sagen, warum der andere Block nicht funktioniert hat?


----------

