zoukankan      html  css  js  c++  java
  • JNDI初认识

    JNDI即Java命名和目录接口,英文全称为Java Naming and Directory Interface,从字面上似乎十分晦涩,下面从理论和实际项目应用方面来阐述。

    1、命名:在我们实际生活或工作中,命名类似如你的身份证号和工号可以"理解"成一种命名服务,即一个值到另一个值的映射,从身份证或工号就可以得知你人本身。

    2、目录服务:从计算机角度理解为在互联网上有着各种各样的资源和主机,但是这些内容都是散落在互联网中,为了访问这些散落的资源并获得相应的服务,就需要用到目录服务。

    在实际项目开发过程中,对于数据源配置方面,JNDI的应用就是一个很好的例子。

    对于一个简单的系统,我们一般会将数据库的连接url、用户名、密码、数据源(c3p0,dbcp等)配置在本系统中,对于SSH项目,通常会这些写在配置文件(properties、xml等)中,在系统初始化的时候,进行读取加载。

    存在的问题:

    1、数据库服务器名称MySQL、用户名和密码都可能需要改变,由此引发JDBC URL需要修改;

    2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

    3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;

    即耦合性太高。

    使用JNDI的案例:

    在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称,然后在程序中,通过数据源名称引用数据源从而访问后台数据库。

    如果项目中使用到spring,可以定义一个spring-res.xml,用于定义使用的jndi名称。

    如:

    <!-- JNDI数据源 -->
    <jee:jndi-lookup id="dataSource" jndi-name="jndi/Java"
    proxy-interface="javax.sql.DataSource" lookup-on-startup="false" />

    即配置数据源名称为jndi/Java

    如果使用Tomcat作为web容器,则在context.xml中配置:

    <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" maxActive="20"
    maxIdel="10" maxWait="1000" name="jndi/shds" type="javax.sql.DataSource"
    url="jdbc:mysql://localhost:3306/java?user=xxx&amp;password=123#pwd&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;generateSimpleParameterMetadata=true&amp;" />

    如果使用JBOSS作为web容器,则在mysql-ds.xml修改

    在程序中引用数据源:

    Context ctx=new InitialContext();  

    Object datasourceRef=ctx.lookup("jndi/Java"); //引用数据源,实际项目中,可以获取spring-res.xml配置文件中jndi-name来获取实际数据源名称。

    DataSource ds=(Datasource)datasourceRef;  

    conn=ds.getConnection(); 

    在系统部署后,如果数据源参数发生改变,只要jndi名称不改,那么我们只要在一个地方修改配置即可,不需要修改源代码,从而是程序员真正关心代码逻辑的实现,

    也达到解耦的目的。

    JNDI的扩展:JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。

  • 相关阅读:
    oracle提交commit后回退恢复
    jQuery toggle() 方法 : 切换隐藏和显示
    sql server vs mysql
    Redis学习
    【转发】c#做端口转发程序支持正向连接和反向链接
    IKVM
    注册表
    解决VS2010自带的C/C++编译器CL找不到mspdb100.dll的问题
    【转载】Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info
    Openwrt路由器上开发微信公众号应用
  • 原文地址:https://www.cnblogs.com/shawnblogs/p/5279733.html
Copyright © 2011-2022 走看看