4

我是一个过去曾经做过一些 J2EE 编码的人,现在我正在重新投入工作,从事一个新的 J2EE 项目。自 2001 年以来发生了很多变化,所以我需要问这个非常基本的问题。

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

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

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

Connection c = dataSource.getConnection();  

它每次都会抛出 NullPointerException 。我在调试器中进入了这个,事实证明,dataSource 为空。

我没有在代码中自己初始化 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 中。上下文条目如下所示:

<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 不为空。

4

2 回答 2

6

您至少需要在应用服务器/conf/context.xml或 Web 应用程序的/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-managed),第二个是指内部(环境)资源(阅读:webcontainer-managed)。换下来看看。

于 2009-11-09T00:51:46.977 回答
2

您的 web.xml 是否定义了资源?看看这个例子。您能否发布您的 web.xml 或定义 jdbc/MyDatabase 的代码?

于 2009-11-09T00:45:00.853 回答