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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj1038500AC!

序列dp 先开始想了一个类似区间dp的东西...少了一维 然后发现似乎不太对&#xff0c;因为女生的最大差和男生的最大差并不相等 dp[i][j][x][y]表示当前有i个人&#xff0c;j个男生&#xff0c;男生和女生的后缀最大差是x&#xff0c;女生和男生最大差是y&#xff0c;x,y>0,转…

机器学习接口代码之 Ridge、Lasso、Elasitc Net

目录 Ridge Regression &#xff08;岭回归&#xff09; Lasso Regression Elasitc Net&#xff08;弹性网络&#xff09; 案例&#xff1a;葡萄酒质量预测 官网地址https://scikit-learn.org/stable/modules/linear_model.html Ridge Regression &#xff08;岭回归&…

公司技术管理角度看C++游戏程序员发展

公司技术管理角度看C游戏程序员发展 H3D 这是我多年来招聘培训游戏程序员的一点想法。一直想汇总一下。主要目的是为了更好的对公司新进C程序员进行培训&#xff0c;并且建立起游戏程序员培训&#xff0c;发展&#xff0c;成才&#xff0c;成为核心骨干&#xff0c;管理层&am…

android生命周期_Android开发 View的生命周期结合代码详解

咱们以TextView控件为例&#xff1a;/*** Created by SunshineBoy on 2020/9/23.*/public class TestTextView extends android.support.v7.widget.AppCompatTextView {public TestTextView(Context context) {super(context);Log.e("TestTextView","TestTextVi…

salt

安装服务端和客户端服务端(marster)yum install salt-master -y客户端(slave)yum install salt-minion -ymarster192.168.11.17/etc/init.d/salt-master start配置文件: vi /etc/salt/mastercat master|egrep -v ;|#|^$auto_accept:True #设置自动接受日志: /var/log/salt/mas…

python | 查看pip支持的文件名和版本

python | 查看pip支持的文件名和版本win下查询大哥推荐已经解决win下查询 import pip._internalprint(pip._internal.pep425tags.get_supported())64位的需要在pip后面加个_internal 如果不行试试下边的 大哥推荐已经解决 import wheel.pep425tags as w print(w.get_suppor…

机器学习算法之支持向量机 SVM

距离知识 点到直线/平面的距离公式&#xff1a; 1、假定点p(x0,y0)&#xff0c;平面方程为f(x,y)AxByC&#xff0c;那么点p到平面f(x)的距离为&#xff1a; 2、从三维空间扩展到多维空间中&#xff0c;如果存在一个超平面f(X)θXb; 那么某一个点X0到这个超平面的距离为: 参考…

set IDENTITY_INSERT on 和 off 的设置

批量插入记录时,对有标识列的字段要设置 set IDENTITY_INSERT 表名 on,然后再执行插入记录操作;插入完毕后恢复为 off 设置 转载于:https://www.cnblogs.com/TTonly/p/10349931.html

VMware Horizon虚拟桌面工具箱2.0-审计,远程协助,控制台,电源

各位朋友,大家好,VMware Horizon 虚拟桌面工具箱2.0版本,已经面世啦!在2.0 版本中我们添加了vSphere虚拟机控制台访问、开机策略和图形化安装这三个新功能&#xff0c;并改进了部分老的功能。老版本即1.5版本的相关知识可以参考我的博文VMware Horizon虚拟桌面工具箱之审计与远…

python词云改颜色_一种用Python生成词云

一种用Python生成词云 我们在阅读一篇很长的文章时&#xff0c;总先看看文章的关键词来获知文章的大概内容。今天我们就来制作一个词云程序&#xff0c;将文章中出现次数较多的词语提取出来&#xff0c;生成一张词云图。词云图的生成原理&#xff1a; 程序会将这篇文章中的所有…

什么是程序员正确的职场心态?

&#xff08;本文为《程序员羊皮卷》最新公布的第七章的一部分&#xff0c;下载地址&#xff1a;http://download.csdn.net/source/1868065 或者http://zhaopinpro.com/wordpress/wp-content/uploads/2009/12/《程序员羊皮卷》第7章-程序员职场心态.doc 欢迎大家购买作者签名…

git第一次提交代码至远程仓库步骤

git第一次提交代码至远程仓库步骤在将要提交的文件目录下打开Git Bash Here1.git init git add . 提交该目录下的所有文件 3.git commit -am “qiantai”(提交到本地仓库) 4.git remote add origin *** (***git地址) 5.git push -u -f origin master(提交到远程仓库&#x…

机器学习之 朴素贝叶斯、贝叶斯网络

目录 贝叶斯定理 朴素贝叶斯算法 高斯朴素贝叶斯 伯努利朴素贝叶斯 多项式朴素贝叶斯 贝叶斯网络 最简单的贝叶斯网络 全连接贝叶斯网络 一般化的贝叶斯网络 引子 参赛者会看见三扇关闭了的门&#xff0c;其中一扇的后面有一辆汽车&#xff0c;选中后面有车的那扇门可…

liunx -bash:ls:command not found,执行命令总是报找不到

解决办法: 使用绝对命令vi打开profile /bin/vi /etc/profile 添加: export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 简便方法: 直接执行 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin export PA…

Nginx的Web管理界面收集

Nginx实在是太强大了&#xff01;灰度发布、金丝雀发布、负载均衡就只需要简单的几行配置就可以实现&#xff0c;这些特性嗾使微软无法比拟的。 原来Nginx除了使用ngx_http_stub_status_module模块&#xff08;http://127.0.0.1/ngx_status&#xff09;实现Web页面上的监控外&a…

attention机制_简析Attention机制—优缺点,实现,应用

什么是Attention机制&#xff1f;Attention机制的本质来自于人类视觉注意力机制。人们在看东西的时候一般不会从到头看到尾全部都看&#xff0c;往往只会根据需求观察注意特定的一部分。简单来说&#xff0c;就是一种权重参数的分配机制&#xff0c;目标是协助模型捕捉重要信息…

高级程序员如何面对职场压力?(2)--受伤的总是我

版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。本文地址&#xff1a;http://tech.it168.com/a2008/0911/204/000000204752.shtml 课程上线消息&#xff1a;Leo讲的《初入公司…

pycharm Debug问题

pycharm Debug问题 参考链接:https://blog.csdn.net/weixin_43472408/article/details/85072640 Debug的调试方式如下所示&#xff1a; 1.show execution point (F10) 显示当前所有断点 2.step over(F8) 单步调试。 若函数A内存在子函数a时&#xff0c;不会进入子函数a内执…

vue表单的用法

你可以用 v-model 指令在表单控件元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇&#xff0c;但 v-model 本质上不过是语法糖&#xff0c;它负责监听用户的输入事件以更新数据&#xff0c;并特别处理一些极端的例子。 v-model 会忽略所有…

php执行npm命令_npm系列之命令执行

当我想使用vue的脚手架来创建一个项目的时候&#xff0c;我应该怎么做&#xff1f;执行命令 npm install -g vue/cli 全局安装&#xff0c;之后就可以在控制台中使用vue create programName 来创建一个项目。为什么可以直接使用vue命令&#xff1f;这类支持命令的依赖会在项目中…