Datenbankverbindungen mit Tomcat
Wo ja Sun kürzlich den Datenbankhersteller Mysql und damit eine der verbreitesten Datenbanken im Web übernommen hat wollen wir die schöne Gelegenheit nutzen und noch einmal zeigen, wie man Mysql auf dem Tomcat einrichten kann. Sicher werden wir das in Zukunft häufiger brauchen.
Zunächst downloaden wir den aktuellen Mysql-JDBC-Treiber, der für die Netzwerkverbindung vom Tomcat zu Mysql zuständig ist. Die entsprechende Jar-File mysql-connector-java-5.x.x-bin.jar gehört nicht in unsere Applikation, sonder in ein Tomcat-Systemverzeichnis, am besten ${CATALINA_HOME}/common/lib, da sie dort sowohl von Tomcat als auch von der Applikation gefunden werden kann.
In unsere Context-Datei (geht nach: ${CATALINA_HOME}/conf/Catalina/localhost/) definieren wir die Datasource:
<?xml version="1.0" encoding="UTF-8"?>
<Context
unpackWARs="false"
autoDeploy="true"
path="/myapp"
reloadable="true">
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="100" maxIdle="30"
maxWait="10000"
name="jdbc/db"
username="dbuser"
password="dbpass"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/mydatabase?autoReconnect=true"
/>
</Context>
Entgegen anderslautenden Aussagen ist es nicht nötig, im Deployment - Descriptor der Applikation eine Resource-Referenz zu schreiben. Die Datasource steht auch ohne diese der Applikation zur Verfügung. Wer das trotzdem aus irgendwelchen Gründen machen muss schreibe in der web.xml:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/db</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Auch ohne diese Referenz kann die Datasource in der Applikation genutzt werden, beispielsweise in JSPs mit der Standard-Taglib:
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <sql:setDataSource dataSource="jdbc/db"/>
Die Referenzierung erfolgt wie man sieht über den Namen jdbc/db.
Um die Datenbankverbindung auch in der Applikation nutzen zu können, konfigurieren wir eine Persistence-Unit nach der Java-Persistence-Api (JPA). Da Beipiel funktioniert mit Toplink, für Hibernate wird man es umschreiben müssen:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="PersistenceUnitName" transaction-type="RESOURCE_LOCAL"> <non-jta-data-source>java:/comp/env/jdbc/db</non-jta-data-source> <class>de.herberlin.blog.Data1</class> <class>de.herberlin.blog.Data2</class> <properties> <property name="toplink.ddl-generation" value="create-tables"/> <property name="toplink.logging.level" value="FINE"/> </properties> </persistence-unit> </persistence>
Beachten Sie, dass eine non-jta-data-source konfiguriert werden muss. Der Name unserer jdbc/db ist hier ihre voller JNDI-Name java:/comp/env/jdbc/db. Die zu persistierenden Klassen können ebenfalls angegeben werden. In der Applikation kann dann der Entity-Manager geholt werden.
Persistence.createEntityManagerFactory("PersistenceUnitName")
.createEntityManager();