我是過去曾經做過一些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中是非空的。
哦,我不知道@Resource不需要在web.xml中設置。謝謝! – the0ther
對不起,我混淆了註釋,你實際上需要在web.xml中定義資源。你只需要將它定義爲''。消息已編輯。 –
BalusC
我的所有數據庫代碼都被埋在一個實現老式連接池的層中...一個沒有公共構造函數的Singleton DbPool類。這可能是什麼給了我麻煩。我會把這一切弄得一團糟,然後嘗試一下這件事。 私人DataSource dataSource字段在什麼時候被初始化爲非null的東西?如果我在沒有私人構造函數的類中使用它,這有什麼關係嗎?該成員是否會在第一次調用構造函數時自動初始化? – the0ther