mysql – JNDI和javax.sql.DataSource

我曾经是过去曾经做过一些J2EE编码的人,而且我正在重新开始研究新的J2EE项目.自2001年以来发生了很多变化,因此我需要提出这个非常基本的问题.

我在我的数据库类中使用这样的语法:

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

我知道这是一个新功能(注释),但我不确定它是如何工作的.后来在我班上我打这个电话:

Connection c = dataSource.getConnection();  

并且它每次都抛出一个NullPointerException.我在调试器中进入此步骤,结果是,dataSource为null.

我没有在代码中自己初始化dataSource,这似乎很神奇和奇怪.知道我做错了什么吗?

我的web.xml包含以下用于建立资源的块:

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

我已经通过在META-INF中使用context.xml文件将其添加到我的Context中. Context条目如下所示:

<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"/>

我正在使用Tomcat 6,MySQL 5,最新的MySQL驱动程序(不是旧的v3,而是最新的v5驱动程序).

更新:这对我不起作用,因为我在一个普通的课堂上使用它.我创建了一个新项目,并为其添加了一个servlet. Servlet中的DataSource非空.

解决方法:

您至少需要在appserver的/conf/context.xml或webapplication的/META-INF/context.xml文件中包含以下内容:

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

另见http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html

在webapp的/WEB-INF/web.xml中,您需要定义以下内容:

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

编辑:我现在看到您编辑了帖子以添加编码.我还看到你使用了resource-ref而不是resource-env-ref.第一个引用外部资源(读取:不是webcontainer管理的),第二个引用内部(环境)资源(读取:webcontainer-managed).更换它,看看.

上一篇:java – JDNI Active Directory,创建具有范围的组


下一篇:java – 是否需要tomcat的server.xml的factory属性?