- 什么是JNDI
JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的是Java命名和目录接口,它提供了一种通过名字来访问各种资源和服务的Java API。在Java EE(Java Enterprise Edition)环境中,JNDI主要用于查找和访问企业级资源,如数据库连接池、消息队列、邮件服务等。
JNDI工作于客户端和服务提供者之间,允许客户端通过逻辑名字查找服务或资源,而不需要知道服务的具体位置或细节。这种抽象层使得应用程序可以在不修改代码的情况下更换服务提供者。
命名服务。JNDI提供统一的命名服务,允许客户端通过名字来查找对象或服务,而不是对象的物理ID。这些名字存储在命名目录中,如LDAP(轻量级目录访问协议)、DNS(域名系统)等。如在tomcat中查找JDBC数据源不是通过数据源的直接引用查找,而是通过JNDI与数据源绑定的名称查找;通过DNS可以使用域名来访问Web应用,而不是直接通过输入Web服务器的IP地址来访问,这里的数据源的引用和IP地址都可以看作是资源的物理ID。
目录服务。JNDI不仅能查找对象,还能浏览和修改目录中的信息。这对于需要管理大量资源属性的应用程序特别有用。
JNDI最常用的就是配置数据源,对于Tomcat容器,一般可以在tomcat/conf/context.xml中配置,也可以在项目文件的WETA-INF目录下创建context.xml文件进行配置。
- 2.JNDI数据源配置
数据源(DataSource)是一种允许程序获取数据库连接的机制。在企业级应用中,数据源通常通过连接池实现,以提高资源利用率和应用性能。
JNDI配置数据源的步骤如下。
(1).在应用服务器上配置数据源,并提供数据库的连接信息。在项目的 META-INF/context.xml 中添加Resource(资源)定义,示例代码如下。
-
<Resource name="jdbc/MyAppDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/ MyAppDB?useSSL=false&serverTimezone=UTC" username="dbuser" password="dbpassword" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
此配置定义了一个名为“jdbc/MyAppDB”的数据源,指向MySQL数据库“ MyAppDB ”。
注意:文件名一定是context.xml,不可更改。
<Resource>标签属性说明
属性 | 说明 | 示例 |
name | 连接池名称,自定义。 | jdbc/MyAppDB |
auth | 设定控制权 ,固定值。 | Container |
type | 数据类型,固定值。 | javax.sql.DataSource |
maxTotal | 最大活动连接数。当前数据源支持的最大并发数。自定义。 | 20 |
maxIdle | 最大空闲连接数。连接池中保留最大数目的闲置连接数。自定义。 | 10 |
maxWaitMillis | 最大空闲时间。当连接池中无连接时的最大等待毫秒数,在等当前设置时间过后还无连接则抛出异常。自定义。 |
|
userName | 访问数据库的用户名,自定义。 | root |
password | 访问数据库的密码,自定义。 | 123456 |
dirverClassName | 驱动的全路径类名。固定值。 | mySql6以后使用: com.mysql.cj.jdbc.Driver |
url | 指定数据库连接IP和数据库名称。 | MySQL6.0及之后版本需要指定服务器时区属性,设定useSSL属性等,多个属性之间用&连接。jdbc:mysql://127.0.0.1:3306/databaseName?serverTimeZone=GMT%2B8&useSSL=false |
(2) 在Web应用的“WEB-INF/web.xml”文件中,声明对JNDI资源的引用,代码如下。
<resource-ref>
<res-ref-name>jdbc/MyAppDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>标签:资源引用,通常是个对象工厂,数据源,JavaMail或者自定义对象工厂配置。这里是数据源。其中,<res-ref-name>标签的值必须与context.xml文件中定义的资源名称一致。<res-type>标签与<res-auth>标签均为固定值。
(3)JNDI查找数据源: 应用程序通过JNDI查找逻辑名称对应的数据源,而不需要知道数据库的具体连接信息。这样,当数据库的配置发生变化时,只需要在应用服务器上更新数据源配置,无需修改应用程序代码。
InitialContext 在web初始化部署时配置,并且对web应用只读访问。所有资源都放在 “java:comp/env ”下。查找数据源代码如下。
//初始化JNDI上下文
Context ctx = new InitialContext();
//查找数据源
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyAppDB");
(4).获取数据库连接: 一旦查找到数据源,应用程序就可以从数据源获取数据库连接。获取数据库连接代码如下。
Connection conn = ds.getConnection();
获取连接后,进一步可以执行SQL语句或其他数据库操作。