【視頻&交流平臺】
à SpringBoot視頻:http://t.cn/R3QepWG
à SpringCloud視頻:http://t.cn/R3QeRZc
à Spring Boot源碼:https://gitee.com/happyangellxq520/spring-boot
à Spring Boot交流平臺:http://412887952-qq-com.iteye.com/blog/2321532
à Spring Boot Shiro視頻:http://t.cn/R3QDMbh
à Spring Boot 2.0 之Spring Data 和JPA:http://t.cn/R1pSojf
需求緣起:
有一網友在博客中留言:
您好,我想問下,如果要支持jdni數據源,是不是把xx.datasource.type=jndi就行了嗎?還是需要加什麼配置或者修改什麼東西嗎?求大神賜教
那麼網友的問題就是在spring boot中jndi是怎麼玩的。那麼在具體使用前,我們會花點時間介紹下JNDI,通過接下來的系列,你會學習到:
(1)JNDI爲何而生?
(2)什麼是JNDI?
(3)在Tomcat中怎麼玩JNDI?
(4)Spring Boot中怎麼玩JNDI
接下來我們來一起了解下蝦米是JNDI吧。
一、JNDI爲何而生?
1.1 JDBC的天下
我們如果要在程序中連接數據庫的話,在沒有JNDI的時候,就是使用JDBC(Java DataBase Connectivity,java數據庫連接)了,是不是已經忘得差不多了,一起來回顧下吧,看如下連接數據庫代碼(代碼支持左右滑動):
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver", true, Thread.currentThread().getContextClassLoader());
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?user=root&password=root");
String sql = "select *from test";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println("id:" + rs.getInt("id") + ",name:" + rs.getString("name") + "");
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
這是在沒有JNDI的連接方式。
1.2 存在問題?
上面的這種方式存在的問題是什麼呢?
(1)數據庫服務器名稱mydb 、用戶名和口令都可能需要改變,由此引發JDBC URL需要修改;
(2)數據庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程序包和類名需要修改;
(3)隨着實際使用終端的增加,原配置的連接池參數可能需要調整;
注意:實際上在使用了Spring等牛逼的框架之後,實際上上面這些問題已經不再是問題了。
1.3 解決方法
程序員應該不需要關心“具體的數據庫後臺是什麼?JDBC驅動程序是什麼?JDBC URL格式是什麼?訪問數據庫的用戶名和口令是什麼?”等等這些問題,程序員編寫的程序應該沒有對 JDBC 驅動程序的引用,沒有服務器名稱,沒有用戶名稱或口令 —— 甚至沒有數據庫池或連接管理。而是把這些問題交給J2EE容器來配置和管理,程序員只需要對這些配置和管理進行引用即可。
由此,就有了JNDI。從上面的分析可以得出,實際上是由容器來管理我們的數據庫連接信息了。
二、什麼是JNDI?
我們看下百度百科的描述(https://baike.baidu.com/item/JNDI/3792442):
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端API,通過不同的訪問提供者接口JNDI服務供應接口(SPI)的實現,由管理者將JNDI API映射爲特定的命名服務和目錄系統,使得Java應用程序可以和這些命名服務和目錄服務之間進行交互。
看完了之後,是不是感覺很抽象呢,這裏我們需要理解這麼幾點:
(1)JNDI是J2EE的規範之一。
(2)JNDI主要有兩部分組成:應用程序編程接口和服務供應商接口。應用程序編程接口提供了Java應用程序訪問各種命名和目錄服務的功能,服務供應商接口提供了任意一種服務的供應商使用的功能。
(3)J2EE 規範要求全部 J2EE 容器都要提供 JNDI 規範的實現。
(4)JNDI 提出的目的是爲了解藕,避免了程序與數據庫之間的緊耦合,使應用更加易於配置、易於部署。
畫外音:JNDI的出現,讓數據庫連接代碼交給容器管理,比如Tomcat、JBOSS等容器,這樣對於開發者就不用關心數據庫配置是什麼,使用的什麼數據庫驅動連接數據庫等。
爲了更便於理解JNDI具體的使用姿勢,我們在下一篇文章中會介紹下《在Tomcat中怎麼玩JNDI?》。今天就先到這裏吧。
所有的課程最後一天優惠!點擊「悟空學院」進行查看!
à悟空學院:http://t.cn/Rg3fKJD
課程目錄:
《從零開始學Spring Boot》
《從零開始學Spring Cloud》
《Spring Boot實戰篇之Shiro》
《Spring Boot 2.0之Spring Data和JPA》