踩风火轮的乌龟 2019-10-24
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。
程序员可以不用关心“具体的数据库后台是什么?JDBC驱动程序是什么?访问数据库的用户名和口令是什么?”等等这些问题,而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。
下面在Tomcat6.0+spring+springMVC+mybatis项目中演示用法。
在context.xml的根节点Context里加入Resource配置
<Resource name="jdbc/mmcDB" //指定的jndi名称,会用于spring数据源bean的配置和ResourceLink的配置 auth="Container"//认证方式,一般默认这个 type="javax.sql.DataSource" //数据源床型,使用标准的javax.sql.DataSource driverClassName="com.mysql.jdbc.Driver" //JDBC驱动器 url="jdbc:mysql://localhost:3306/test" //数据库URL地址 username="test" //数据库用户名 password="test" //数据库密码 maxIdle="40" //最大的空闲连接数 maxWait="4000" //当池的数据库连接已经被占用的时候,最大等待时间 maxActive="250" //连接池当中最大的数据库连接 removeAbandoned="true" removeAbandonedTimeout="180" logAbandoned="true" //被丢弃的数据库连接是否做记录,以便跟踪 factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />
factory:该Resource 配置使用的是哪个数据源配置类,这里使用的是tomcat自带的标准数据源Resource配置类,这个类也可以自己写,实现javax.naming.spi.ObjectFactory 接口即可。
如果使用其他的数据池,如阿里巴巴的druid,要满足两个条件:
driverClassName的其他写法:
oracle:oracle.jdbc.driver.OracleDriver
db2:com.ibm.db2.jcc.DB2Driver
SQLServer:com.microsoft.sqlserver.jdbc.SQLServerDriver
url的其他写法示例:
oracle:jdbc:oracle:thin:@192.168.1.249:1521:XE
db2:jdbc:db2://18.1.99.7:55555/esdb:currentSchema=EMPSAL
这种配法可写多个resource给不同的项目使用
方法二:全局的 Resource,更改server.xml和context.xml
把上面的context.xml的Resource标签加内容直接拷贝到server.xml的GlobalNamingResources标签里就行了
接下来有四种方式引用这个全局的Resource
方法2没弄出来,方法1,3,4是可以的,事实上3和4是同一种方法,只要在建项目时在项目的webapps/mmc/META-INF/下写好context.xml,这两个方法所要求的context.xml都会在启动tomcat后自动生成(tomcat7.0没有自动生成,不过这样写过后相当于用来方法4,一样可以成功启动)
<ResourceLink global="jdbc/mmcDB" name="jdbc/mmcDB" type="javax.sql.DataSource"/>
<!-- 在host标签内新增,第一行为加载的工程配置,第二行是该工程需要的ResourceLink配置 --> <context docBase="mmc" path="" reloadable="false"> <ResourceLink global="jdbc/mmcDB" name="jdbc/mmcDB" type="javax.sql.DataSource"/> </context>
<?xml version="1.0" encoding="UTF-8"?> <Context> <ResourceLink global="jdbc/mmcDB" name="jdbc/mmcDB" type="javax.sql.DataSource"/> </context>
<ResourceLink global="jdbc/mmcDB" name="jdbc/mmcDB" type="javax.sql.DataSource"/>
<bean id="testDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/mmcDB</value> </property> </bean> 或者: <bean id="testDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jdbc/mmcDB</value> </property> <property name="resourceRef"> <value>true</value> </property> </bean>
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/mmcDB" />
Tomcat中在server.xml下配置你必需重启服务器才能生效,而context.xml配置保存后tomcat会自动加载无需重启
JNDI地址写法:AB两种地址的用法可点击参考资料的第一条链接查看
在描述JNDI,例如获得数据源时,JNDI地址 有两种写法,例如同是 jdbc/testDS 数据源:
A: java:comp/env/jdbc/testDS
B: jdbc/testDS
这两种写法,配置的方式也不尽相同,用A就行了别纠结,网上查了一堆资料都说的乱七八糟。
java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。
在J2EE中的引用常用的有:
JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明
JMS 连接工厂在java:comp/env/jms 子上下文中声明
JavaMail 连接工厂在java:comp/env/mail 子上下文中声明
URL 连接工厂在 java:comp/env/url子上下文中声明