前言:在学习数据源的使用时,了解到可以通过JNDI方式配置数据源。于是,便想深入理解JNDI是什么。在网上查阅了许多资料,发现讲解不是很全面,现将网上查阅的资料总结如下文。本文主要讲解:JNDI是什么,有什么作用。如何在Tomcat中通过JNDI方式配置数据源。
一、JNDI简介
1、JNDI是什么
JNDI(Java Naming and Directory Interface,Java 命名和目录接口)是一组在Java应用中访问命名服务和目录服务的API。其中,JavaEE要求Web容器(如:tomcat)必须实现JNDI规范。
2、命名服务和目录服务
context: 上下文或容器,用于存储命名服务建立的映射关系。
命名服务:建立名称和对象之间的映射,以便可以通过名称访问到对象。
目录服务:目录服务是命名服务的扩展,目录服务的对象不单有名称,还有属性,既可以通过名称查找对象,也可以通过属性查找到一批对象然后筛选出自己需要的对象
3、使用JNDI好处
以JNDI配置数据源为例,当数据源变更(如:更换数据库类型,更改用户名或密码,更改连接的URL等),只需要web服务器管理员去修改JNDI数据源的配置文件即可,不需要开发人员去修改程序代码,从一定程度上达到了程序解耦的目的。同时,不特数据源如此,对于程序使用其他 外部资源的情况,也可以使用JNDI配置.二、JNDI应用:配置数据源
1、Tomcat服务器
第一步:向tomcat安装目录下的lib中添加JDBC驱动程序如图所示,我这里使用的mysql数据库的驱动程序
第二步:在与WEB-INf同级的目录下新建META-INF/context.xml并配置
对于IDEA开发工具,生成META-INF/context.xml可通过如下图所示方式:
在META-INF/context.xml中配置如下代码:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
<Resource name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/comment"
username="root" password="root"
maxActive="20" maxIdle="10"
maxWait="10000"/>
</Context>
属性说明:
maxActive:同一时刻可以自数据库连接池中被分配的最大活动实例数。
maxIdle : 同一时刻数据库连接池中处于非活动状态的最大连接数。
maxWait:当连接池中没有可用连接时,连接池在抛出异常前将等待的最大时间,单位毫秒。
auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效
type:此名称所代表的类型,现在为javax.sql.DataSource
第三步:配置WEB-INF/web.xml文件
添加如下代码:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<resource-ref>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
元素说明:
resource-ref:用于对外部资源引用的声明,即告诉阅读web.xml文件的人,此web应用使用了外部资源,名字是什么,类型是什么。即使不在web.xml中添加此元素程序也可以正常使用,其作用类似注释,起说明作用。
2、spring框架
通过JNDI服务获取数据源注册到spring容器中
<beans>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/oracleDb"/>
</bean>
</beans>