Java – Datasource JNDI configuration in Tomcat 7.0 for Hibernate

datasourcehibernatejavatomcat

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]

Best Answer

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

Related Topic