JNDI and javax.sql.DataSource

13,363

Solution 1

You need at least to have the following in either the appserver's /conf/context.xml or the the webapplication's /META-INF/context.xml file:

<Resource
    name="jdbc/MyDatabase" 
    type="javax.sql.DataSource"
    driverClassName="com.your.Driver"
    url="jdbc:your://url"
    username="foo"
    password="bar"
/>

Also see http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

And in the webapp's /WEB-INF/web.xml you need to define the following:

<resource-env-ref>
    <resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

Edit: I now see that you edited your post to add the coding. I also see that you used resource-ref instead of resource-env-ref. The first refers to an external resource (read: not webcontainer-managed) and the second refers to an internal (environmental) resource (read: webcontainer-managed). Replace it and see.

Solution 2

Does your web.xml define the resource? Take a look at this example. Could you post your web.xml or the code that defines the jdbc/MyDatabase?

Share:
13,363
Randy L
Author by

Randy L

my user id is a low low 13800!

Updated on June 04, 2022

Comments

  • Randy L
    Randy L almost 2 years

    I'm someone that used to do some J2EE coding in the past and I'm coming back into the fold to work on a new J2EE project. A lot has changed since 2001, so I need to ask this very basic question.

    I'm using syntax like this in my database class:

    @Resource(name = "jdbc/MyDatabase")  
    private javax.sql.DataSource dataSource;  
    

    I understand this is a new feature (annotations) but I'm not really sure how it works. Later on in my class I make this call:

    Connection c = dataSource.getConnection();  
    

    And it throws a NullPointerException everytime. I step into this in the debugger and as it turns out, dataSource IS null.

    It seems magical and weird that I do not initialize dataSource myself in the code. Any idea what I'm doing wrong?

    My web.xml contains the following block to establish the resource:

    <resource-env-ref>
        <resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

    And I've added this to my Context by using a context.xml file in META-INF. The Context entry looks like:

    <Resource name="jdbc/MyDatabase" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="username" password="password" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://127.0.0.1:3306/mydb?autoReconnect=true"/>
    

    I'm using Tomcat 6, MySQL 5, the latest MySQL driver (not the older v3 but the newest v5 driver).

    Update: This is not working for me because I'm using it in a plain-old class. I've created a new project and added a servlet to it. The DataSource is non-null in the servlet.