JNDI 和 javax.sql.DataSource

发布于 2024-08-10 17:16:58 字数 1274 浏览 7 评论 0原文

我过去曾做过一些 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 文件将其添加到我的上下文中。上下文条目如下所示:

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

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我家小可爱 2024-08-17 17:16:58

您至少需要在应用程序服务器的 /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

在 web 应用程序的 /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 管理)。更换一下看看。

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.

假装不在乎 2024-08-17 17:16:58

您的 web.xml 是否定义了资源?看一下这个示例。您可以发布您的 web.xml 或定义 jdbc/MyDatabase 的代码吗?

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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文