Datasource JNDI configuration in Tomcat 7.0 for Hibernate

13,772

It is simpler than it may seem:

  1. don't put anything about JNDI in your web.xml
  2. in the context.xml you are using (whether global or webapp relative) use the proper name, say "jdbc/employee"
  3. to hibernate configuration pass the name in the form "java:comp/env/jdbc/employee"

Here is the reference page:

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

Share:
13,772
Dragon
Author by

Dragon

Updated on June 14, 2022

Comments

  • Dragon
    Dragon almost 2 years

    When Datasource is configured in (tomcat 7) server.xml or in Context.xml, hibernate is not able to identify JNDI and throwing below excpetion but same is working fine when I tried to access datasource using JNDI in the code. What am doing wrong

    Below is my configuration in hibernate.properties

    hibernate.connection.driver_class com.mysql.jdbc.Driver
    hibernate.connection.pool_size 10
    hibernate.dialect org.hibernate.dialect.MySQL5Dialect
    hibernate.connection.datasource java:comp/env/jdbc/employee
    hibernate.show_sql true
    hibernate.format_sql true
    

    in server.xml

     <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->
    
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false"/>
        **<Context docBase="hibernate" path="/hibernate">
                <Resource name="jdbc/employee" auth="Container"
              type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:45000/hibernatetest"
              username="user" password="hibernate" maxActive="20" maxIdle="10"
              maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"/>
            </Context>**
      </Host>
    

    In Context.xml file

        **<Context docBase="hibernate" path="/hibernate">
            <Resource name="jdbc/employee" auth="Container"
              type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:45000/hibernatetest"
              username="user" password="hibernate" maxActive="20" maxIdle="10"
              maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"/>
        </Context>**
    

    Finally below is my web.xml file

        <?xml version="1.0" encoding="ISO-8859-1"?>
        <!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
        **<web-app >
            <servlet>
                <servlet-name>employee</servlet-name>
                <servlet-class>edu.experiments.web.EmployeViewer</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>employee</servlet-name>
                <url-pattern>/employee</url-pattern>        
            </servlet-mapping>
    
            <resource-ref>
                <description>DB Connection</description>
                <res-ref-name>jdbc/employee</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
            </resource-ref>
        </web-app>**
    
    
    org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/jdbc/employee]