jndi是什么呜投?
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標(biāo)準(zhǔn)的Java命名系統(tǒng)接口,JNDI提供統(tǒng)一的客戶端API攘轩,通過(guò)不同的訪問(wèn)提供者接口JNDI服務(wù)供應(yīng)接口(SPI)的實(shí)現(xiàn),由管理者將JNDI API映射為特定的命名服務(wù)和目錄系統(tǒng)码俩,使得Java應(yīng)用程序可以和這些命名服務(wù)和目錄服務(wù)之間進(jìn)行交互度帮。目錄服務(wù)是命名服務(wù)的一種自然擴(kuò)展。兩者之間的關(guān)鍵差別是目錄服務(wù)中對(duì)象不但可以有名稱還可以有屬性(例如稿存,用戶有email地址)笨篷,而命名服務(wù)中對(duì)象沒(méi)有屬性。
以上是引用百度百科的解釋瓣履。JNDI(Java Naming and Directory Interface)是一個(gè)應(yīng)用程序設(shè)計(jì)的API率翅,為開(kāi)發(fā)人員提供了查找和訪問(wèn)各種命名和目錄服務(wù)的通用、統(tǒng)一的接口袖迎,類(lèi)似JDBC都是構(gòu)建在抽象層上“财福現(xiàn)在JNDI已經(jīng)成為J2EE的標(biāo)準(zhǔn)之一,所有的J2EE容器都必須提供一個(gè)JNDI的服務(wù)瓢棒。
那么怎么在一個(gè)簡(jiǎn)單的web服務(wù)中配置JNDI
數(shù)據(jù)源呢浴韭?
1、在tomcat中context.xml文件中增加如下配置
<Context>
<Resource name="jdbc/UserPlatformDB"
type="javax.sql.DataSource" auth="Container"
description="Derby database for User Platform"
maxActive="100" maxIdle="30" maxWait="10000"
username="" password=""
driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby:/db/user-platform;create=true"/>
</Context>
或者通過(guò)外部文件覆蓋tomcat
中的配置文件 maven
增加如下配置
<configuration>
<mode>context</mode>
<contextFile>src/main/webapp/WEB-INF/context.xml</contextFile>
<contextReloadable>true</contextReloadable>
<backgroundProcessorDelay>5</backgroundProcessorDelay>
<path>/user-web</path>
<port>80</port>
</configuration>
2脯宿、修改web.xml
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/UserPlatformDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3念颈、通過(guò)代碼獲取JNDI
數(shù)據(jù)源配置信息
@WebListener
public class DBConnectionInitializerListener implements ServletContextListener {
/**
* 當(dāng)Servlet 容器啟動(dòng)Web 應(yīng)用時(shí)調(diào)用該方法。在調(diào)用完該方法之后连霉,容器再對(duì)Filter 初始化榴芳,
* 并且對(duì)那些在Web 應(yīng)用啟動(dòng)時(shí)就需要被初始化的Servlet 進(jìn)行初始化。
*
* @param sce
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
//獲取上下文中jndi數(shù)據(jù)源信息
InitialContext context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/UserPlatformDB");
if (dataSource != null) {
DBConnectionPoolManager.setDataSource(dataSource);
DBConnectionPoolManager.setMaxSize(10);
} else {
String databaseURL = "create=true";
EmbeddedDataSource embeddedDataSource = new EmbeddedDataSource();
embeddedDataSource.setDatabaseName("/db/user-platform");
embeddedDataSource.setConnectionAttributes(databaseURL);
DBConnectionPoolManager.setDataSource(embeddedDataSource);
DBConnectionPoolManager.setMaxSize(10);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(sce);
}
/**
* 當(dāng)Servlet 容器終止Web 應(yīng)用時(shí)調(diào)用該方法跺撼。在調(diào)用該方法之前窟感,容器會(huì)先銷(xiāo)毀所有的Servlet 和Filter 過(guò)濾器。
*
* @param sce
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
DBConnectionPoolManager.releaseAllConnection();
System.out.println(sce);
}
}
4歉井、把ServletContextListener
監(jiān)聽(tīng)添加容器中柿祈,在web.xml
增加如下配置
<listener>
<listener-class>com.cdd.user.web.web.listener.DBConnectionInitializerListener</listener-class>
</listener>
5、項(xiàng)目啟動(dòng)時(shí)哩至,DBConnectionInitializerListener
會(huì)自動(dòng)獲取JNDI
數(shù)據(jù)源的配置信息躏嚎,放到數(shù)據(jù)庫(kù)連接池管理器DBConnectionPoolManager
中
項(xiàng)目地址:https://github.com/cuoduidui/geekbanglessons