2009-11-09 25 views
4

我是過去曾經做過一些J2EE編碼的人,並且我正在回到工作中來處理新的J2EE項目。自2001年以來發生了很多變化,所以我需要提出這個非常基本的問題。JNDI和javax.sql.DataSource

我正在使用的語法像這樣在我的數據庫類:

@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文件添加到了我的上下文。上下文條目如下:

<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。 DataSource在servlet中是非空的。

回答

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管理),第二種是指內部(環境)資源(閱讀:webcontainer管理)。替換它並看看。

+0

哦,我不知道@Resource不需要在web.xml中設置。謝謝! – the0ther

+0

對不起,我混淆了註釋,你實際上需要在web.xml中定義資源。你只需要將它定義爲''。消息已編輯。 – BalusC

+0

我的所有數據庫代碼都被埋在一個實現老式連接池的層中...一個沒有公共構造函數的Singleton DbPool類。這可能是什麼給了我麻煩。我會把這一切弄得一團糟,然後嘗試一下這件事。 私人DataSource dataSource字段在什麼時候被初始化爲非null的東西?如果我在沒有私人構造函數的類中使用它,這有什麼關係嗎?該成員是否會在第一次調用構造函數時自動初始化? – the0ther

2

您的web.xml是否定義資源?看看this example。你可以發佈你的web.xml或定義jdbc/MyDatabase的代碼嗎?

相關問題