JDBC与JNDI应用比较
JNDI用了多年但是一直没去弄懂其和JDBC的区别,今天在网上搜了下,发下些资料说明的还不错记录下。
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?
要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。
没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。 就像以下代码这样:
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver",true, Thread.currentThread().getContextClassLoader());
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
......
conn.close(); }
catch(Exception e) { e.printStackTrace(); }
finally {
if(conn!=null) { try {
conn.close();
} catch(SQLException e) {} } }
这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。
没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL
需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整; 4、......
解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。
由此,就有了JNDI。
用了JNDI之后的做法:
首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。 具体操作如下(以JBoss为例): 1、配置数据源
在JBoss 的 D:\jboss420GA\docs\examples\jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:\jboss420GA\server\default\deploy。
修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下: <?xml version="1.0" encoding="UTF-8"?> <datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/lw</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name>
<password>rootpassword</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <metadata>
<type-mapping>mySQL</type-mapping> </metadata>
</local-tx-datasource> </datasources>
这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。
2、在程序中引用数据源:
Connection conn=null; try {
Context ctx=new InitialContext();
Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源 DataSource ds=(Datasource)datasourceRef; conn=ds.getConnection();
......
c.close(); }
catch(Exception e) { e.printStackTrace(); }
finally {
if(conn!=null) { try {
conn.close();
} catch(SQLException e) { } } }
直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。
在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。
由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。
JNDI的扩展:
JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。
所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。
EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。外部资源”。
总结:
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。
在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的
本文转自 古道卿 51CTO博客,原文链接:http://blog.51cto.com/gudaoqing/1315041
JDBC与JNDI应用比较相关推荐
- JDBC 与 JNDI 这两种连接方式 区别
jdbc(Java Data Base Connectivity)是数据库中间代理商为了是java连接数据库而定的一个协议 或者说是方法,通过jdbc-odbc的方法进行数据库连接,是连接一次创建一次 ...
- JNDI配置DataResource代替JDBC连接数据库
JNDI配置DataResource代替JDBC连接数据库 1.JDBC和JNDI JDBC就是我们连接数据库的一个标准的Java API,JDBC提供了一系列接口和规范,各个数据库公司根据其JD ...
- Tomcat5.5x+jndi配置
1.配置Tomcat5.5.X的Server.xml,在<host>下面加上: <Context path="/JNDIDemo" docBase="D ...
- JDBC常见面试题集锦(二)
JDBC的保存点(Savepoint)是什么,如何使用? 有时候事务包含了一组语句,而我们希望回滚到这个事务的某个特定的点.JDBC的保存点可以用来生成事务的一个检查点,使得事务可以回滚到这个检查点. ...
- 如何在Tomcat中设置JNDI数据库连接池-Spring教程示例
在Spring和Tomcat中设置JNDI数据库连接池非常容易. Tomcat服务器文档提供了有关如何在Tomcat 5.6或7中设置连接池的足够信息.在这里,我们将结合使用Tomcat 7和Spri ...
- 连接MySQL和连接文件夹区别_JDBC与JNDI这两种连接方式有什么区别?
配置 JNDI绑定 此处绑定的数据源是以 DBCP 为实现.首先必须将数据库驱动(这里用了MYSQL数据库)和DBCP所需要的 Jar 包复制到 Jetty 根目录的 lib 目录下.DBCP主要需要 ...
- Java中的Tomcat数据源JNDI示例
Welcome to Tomcat DataSource JNDI Example Tutorial. We looked at the JDBC DataSource in the last tut ...
- JNDI的学习和认识
JNDI Java术语 英文全称是:Java Naming and Directory Interface 术语解释:一组帮助做多个命名和目录服务接口的API. JNDI(Java Naming an ...
- JAVA面试相关基础知识
1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...
最新文章
- datediff什么作用php,php中easter_date函数的功能起什么作用呢?
- PDMan-2.1.3 发布:用心开源,免费的国产数据库建模工具
- ABAP高级顾问应该掌握的技术
- Lua脚本语法说明(修订)
- html5用圆圈画猫,html5的应用-画一个可爱的小猫咪效果图
- 九、玩转JavaScript的数组(五)
- vue生命周期大白话篇
- (第九周)团队项目14
- Python 爬取淘宝商品信息栏目
- python兔子和獾_少儿编程分享:手把手教你用PYTHON编写兔獾大作战(三)
- android 透明主题 crash,Android 8.0 的填坑(透明的activity崩溃)
- 记忆化搜索=搜索的形式+动态规划的思想(来自百度百科)
- linux pipe 阻塞,Linux pipe():從管道中讀取數據並不總是能夠解阻塞寫入器
- Linux 启动snort服务,在 Ubuntu 15.04 中如何安装和使用 Snort
- 删除word中单独一页的页眉线和前后有页眉但在中间加一页空白页
- Atitit.创业之uke团队规划策划 v9
- [转载] 七龙珠第一部——第012话 向神龙许愿
- mybatis-plus批量insert效率低下怎么办(mysql)
- HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)
- 八月流火,谁是京东数科最燃的研发人?