199. Spring Boot JNDI:這是蝦米?

 

【視頻&交流平臺】

à 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 和JPAhttp://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》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章