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! Alexius Dionysius Diakogiannis is a Senior Java Solutions Architect and Squad Lead at the European Investment Bank. He has over 20 years of experience in Java/JEE development, with a strong focus on enterprise architecture, security and performance optimization. He is proficient in a wide range of technologies, including Spring, Hibernate and JakartaEE. Alexius is a certified Scrum Master and is passionate about agile development. He is also an experienced trainer and speaker, and has given presentations at a number of conferences and meetups. In his current role, Alexius is responsible for leading a team of developers in the development of mission-critical applications. He is also responsible for designing and implementing the architecture for these applications, focusing on performance optimization and security.