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  και προσθέτουμε στο τέλος
    <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"/>
    

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

    • 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 γράφουμε τα

<bean id="mainDatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    	<property name="jndiName" value="java:/TestDB"/>
</bean>

Αν πάλι έχουμε μια τυπική web εφαρμογή στο web.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>

Και μέσα στην 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 * 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>
Facebook Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.