JNDI學習總結(一)——JNDI資料來源的配置
阿新 • • 發佈:2018-12-30
一、資料來源的由來
在Java開發中,使用JDBC操作資料庫的四個步驟如下:
②連線資料庫(Connection con = DriverManager.getConnection();)
③操作資料庫(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
④關閉資料庫,釋放連線(con.close();)
也就是說,所有的使用者都需要經過此四步進行操作,但是這四步之中有三步(①載入資料庫驅動程式、②連線資料庫、④關閉資料庫,釋放連線)對所有人都是一樣的,而所有人只有在操作資料庫上是不一樣,那麼這就造成了效能的損耗。
那麼最好的做法是,準備出一個空間,此空間裡專門儲存著全部的資料庫連線,以後使用者用資料庫操作的時候不用再重新載入驅動、連線資料庫之類的,而直接從此空間中取走連線,關閉的時候直接把連線放回到此空間之中。
那麼此空間就可以稱為連線池(儲存所有的資料庫連線),但是如果要想實現此空間的話,則必須有一個問題要考慮?
1、 如果沒有任何一個使用者使用連線,那麼那麼應該維持一定數量的連線,等待使用者使用。
2、 如果連線已經滿了,則必須開啟新的連線,供更多使用者使用。
3、 如果一個伺服器就只能有100個連線,那麼如果有第101個人過來呢?應該等待其他使用者釋放連線
4、 如果一個使用者等待時間太長了,則應該告訴使用者,操作是失敗的。
如果直接用程式實現以上功能,則會比較麻煩,所以在Tomcat 4.1.27之後,在伺服器上就直接增加了資料來源的配置選項,直接在伺服器上配置好資料來源連線池即可。在J2EE伺服器上儲存著一個數據庫的多個連線。每一個連線通過DataSource可以找到。DataSource被繫結在了JNDI樹上(為每一個DataSource提供一個名字)客戶端通過名稱找到在JNDI樹上繫結的DataSource,再由DataSource找到一個連線。如下圖所示:
二、JNDI+Tomcat配置資料來源的兩種方式
2.1、全域性jndi配置
此種配置需要在server.xml中配置資料來源,具體的配置步驟如下:
1、在tomcat伺服器的lib目錄下加入資料庫連線的驅動jar包
2、修改tomcat伺服器的conf目錄下server.xml配置檔案
開啟server.xml配置檔案,可以看到裡面自帶的一個全域性JNDI配置,如下圖所示:
編輯server.xml檔案,新增全域性JNDI資料來源配置,配置如下:
1 <!-- Global JNDI resources 2 Documentation at /docs/jndi-resources-howto.html 3 --> 4 <GlobalNamingResources> 5 <!-- Editable user database that can also be used by6 UserDatabaseRealm to authenticate users 7 --> 8 <Resource name="UserDatabase" auth="Container" 9 type="org.apache.catalina.UserDatabase" 10 description="User database that can be updated and saved" 11 factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 12 pathname="conf/tomcat-users.xml" /> 13 <!-- 14 |- name:表示以後要查詢的名稱。通過此名稱可以找到DataSource,此名稱任意更換,但是程式中最終要查詢的就是此名稱, 15 為了不與其他的名稱混淆,所以使用jdbc/oracle,現在配置的是一個jdbc的關於oracle的命名服務。 16 |- auth:由容器進行授權及管理,指的使用者名稱和密碼是否可以在容器上生效 17 |- type:此名稱所代表的型別,現在為javax.sql.DataSource 18 |- maxActive:表示一個數據庫在此伺服器上所能開啟的最大連線數 19 |- maxIdle:表示一個數據庫在此伺服器上維持的最小連線數 20 |- maxWait:最大等待時間。10000毫秒 21 |- username:資料庫連線的使用者名稱 22 |- password:資料庫連線的密碼 23 |- driverClassName:資料庫連線的驅動程式 24 |- url:資料庫連線的地址 25 --> 26 <!--配置Oracle資料庫的JNDI資料來源--> 27 <Resource 28 name="jdbc/oracle" 29 auth="Container" 30 type="javax.sql.DataSource" 31 maxActive="100" 32 maxIdle="30" 33 maxWait="10000" 34 username="lead_oams" 35 password="p" 36 driverClassName="oracle.jdbc.driver.OracleDriver" 37 url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/> 38 39 <!--配置MySQL資料庫的JNDI資料來源--> 40 <Resource 41