關於JNDI配置以及執行報錯詳解
在介紹JNDI配置之前,先讓我好好吐槽一下。先說說今天在Java社群裡面逛,看到關於資料庫連線池的技術已經發展到好幾種了,還停留在dbcp技術的我也沒臉說什麼。得知現在Apache下的tomcat在7.0版本的時候已經推出了新的連線池技術-tomcatJDBC。
啥也沒說,上手就開始幹了。上網一搜tomcatJDBC的配置,一看一大把,瞬間心裡各種感動啊。隨便開啟一個就跟著開始配置起來。具體配置的方式我還是先簡單說一下吧,具體也正如網上說的,tomcatJDBC的配置方式分成兩種。第一種就是直接用Java程式碼寫,第二種就是採用JNDI配置方式的,所謂JNDI呢,就是Java Naming and Directory Interface。啥也別說,作為一個嚮往Java大神的我來說自然是採用第二種了。
好了,言歸正傳,具體配置過程呢,就是新了一個context.xml放在web工程下的META-INF這個資料夾下,這個XML檔案裡面具體配置的當然就是TomcatJDBC的一些引數了,具體與本文無關我也就不多講了。那麼問題就來了。當我配置完之後,直接新建了一個帶Main()函式的類就是測試了。
這個類如下,很簡單:
系統馬上就給報了個錯,錯誤如下:
看到錯誤之後呢,心情也沒那麼差,想想網上還有這麼多資料呢。於是,開始了無窮無盡的開啟一個又一個內容一樣的資料,心裡就開始了一萬隻草泥馬在奔騰啊。心想這些人都是什麼素質啊,全TM都是複製轉載,每篇部落格裡面連TM錯別字也一樣,我也是醉了。這也是我今天想寫下這篇部落格的原因。我真的是很想吐槽一下現在網上的這個學習環境,你說你寫部落格不就是在教別人知識麼,為嘛要寫的這麼簡單,就只是告訴人家程式碼是這樣就完了,就不能多加一句解釋這些程式碼是幹嘛的,為什麼要這樣寫麼?充當大神怕掉面子?這對於我們這些初學者來說實在是太不友好了。
好了,言歸正傳,我還是先不吐槽了,把問題說清楚吧。eclipse報了這個錯,我就開始在網上查,好吧,又是一把辛酸淚,每篇文章沒解釋對先不說,還都TM的是一樣,有的不好意思,還加了句,是我在做專案時遇到的問題,後來用了這種方法解決了,我TM就想問一句,你確定是做了嗎?別禍害我們這些不懂的小盆友了啦!
好吧,度娘不靠譜,還是得靠自己,仔細閱讀了一下報的錯,翻譯成漢語意思就是:需要去具體說明類的名字在環境或者系統屬性中,報的異常是NoInitialContextException。錯誤的語句是這句話,DataSource source=(DataSource)ct.lookup("java:comp/env/jndi/test"),核心呢就是InitialContext這個物件了,沒辦法只有去查JDK官方文件了,還官方文件靠譜,原文記載如下:在InitialContext物件進行初始化時如果初始化不成功或者物件
進行某種操作時無措就會報這個異常。這句程式碼的意思呢可以分成如下兩步:
Context con = ct.lookup("java:comp/env");
DataSource datasource = con.lookup("jndi/test");
顯然就是第一句話錯了唄,為啥第一句錯了,路徑引數也沒寫錯啊,那肯定就是Initialcontext這個物件在初始化的時候就錯了,這時一切就都說得過去了。
言歸正傳,開始思考為啥 Context ct = new InitialContext();這句程式碼就不對了咧,折騰了一下午才發現,原來是這個東西在作怪
在執行這個main函式條件下,new Context()時,系統就無法從System.properties中讀取正確的JNDI引數了,所以你之前配置放在META-INF下的context.xml自然就載入不進去,這樣就難怪系統會報這個錯了。
解決辦法:
程式不變,只要不是用Java application執行的就是OK 了。很簡單吧