Create a JNDI Datasource with Tomcat 7

Μια multi-user εφαρμογή που χρησημοποιεί κάποια database δεν μπορεί να είναι αξιόπιστη αν δεν χρησημοποιεί connection pooling. Ο Tomcat 7 αντικατέστησε την απο προεπιλογή common-dbcp βιβλιοθήκη του με το Tomcat JDBC. Μπορειτε να δειτε εδώ http://www.tomcatexpert.com/blog/2012/01/24/using-tomcat-7-jdbc-connection-pool-production και εδώ http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency μερικά άρθρα γι αυτό το ζήτημα.

Έστωσαν οτι θέλουμε να φτιάξουμε ενα τέτοιο pool σε εναν Tomcat 7 για μια MySQL βάση δεδομένων. Ισοδύναμα βήματα γίνονται για ολες τις αλλες βάσεις. Τα βήματα που κάνουμε είναι τα εξής.

  1. Κατεβάσουμε τον JDBC Driver της MySQL απο εδω http://dev.mysql.com/downloads/connector/j/ και αντιγράφουμε το jar στο [tomcat-installation-path]\lib
  2. Ανοίγουμε το αρχείο [tomcat-installation-path]\conf\context.xml  και προσθέτουμε στο τέλος[code lang=”xml”]
    <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/javatest"/>
    [/code]

    Παραπάνω έχουμε τα εξής

    • name=”jdbc/TestDB”  Το jdbc ειναι το προθεμα που θα μας κανει να γνωριζουμε οτι το συγκεκριμένο resource pool αφορά jdbc. TestDB είναι το όνομα του pool (συνήθως το όνομα της βάσης).
    • maxActive, maxIdle Ο μέγιστος και ο ελάχιστος αριθμός των συνδέσεων στη βάση
    • maxWait μέγιστος χρόνος αναμονής σε ms για να αποκτηθεί ένα connection
    • username, password όνομα χρήστη και κωδικός της βάσης
    • driverClassName Το classname του driver
    • url Το JDCB url
  3. Δεν έχει νουμερο 3… :p Με μια επανεκκίνηση του Tomcat το pool είναι έτοιμο.

Για να τεσταρουμε το παραπάνω αν χρησημοποιούμε Spring γράφουμε τα

[code lang=”xml”]
<bean id="mainDatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:/TestDB"/>
</bean>
[/code]

Αν πάλι έχουμε μια τυπική web εφαρμογή στο web.xml βάζουμε τα
[code lang=”xml”]
<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>
[/code]

Και μέσα στην jsp την καλούμε ώς

[code lang=”xml”]
<%@ 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 * from test_table
</sql:query>

<html>
<head>
<title>Datasource Test Page</title>
</head>
<body>

<h2>Results</h2>

<c:forEach var="row" items="${rs.rows}">
Foo ${row.foo}<br/>
Bar ${row.bar}<br/>
</c:forEach>

</body>
</html>
[/code]

Passionate Archer, Runner, Linux lover and JAVA Geek! That's about everything! He has worked for many years as an Software Architect designing and developing enterprize projects, e-banking and high availability portals with extensive experience in the public, european and private sectors. Having speaker in several confrences he never misses opportunities to interact with the OSS community. In his leisure time he either runs or shoots a lot of arrows!