mysqljakarta-eejnditomcat6

JNDI and javax.sql.DataSource


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.


Solution

  • 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.