代码之家  ›  专栏  ›  技术社区  ›  Randy L

JNDI和javax.sql.DataSource

  •  4
  • Randy L  · 技术社区  · 16 年前

    我在数据库类中使用的语法如下:

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

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

    Connection c = dataSource.getConnection();  
    

    每次它都抛出一个NullPointerException。我在调试器中对此进行了一步,结果证明,dataSource为null。

    My 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中为非null。

    2 回复  |  直到 16 年前
        1
  •  6
  •   BalusC    16 年前

    您至少需要在appserver的 /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

        2
  •  2
  •   John Paulett    16 年前

    您的web.xml是否定义了资源?看看 this example

    推荐文章