JNDI是用来做什么的?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Blessed_/article/details/72809004

   .什么是JDNI

    1.java Naming and Directory Interface,java命名和目录接口

     2.是一组在Java应用中访问命名和目录服务的API

     3.通过名称将资源与服务进行关联

这些都是一些官方的解释,一时半会也很那理解透彻,下面是我自己对JDNI的理解

JNDI是用来干什么的?说通俗一点它就是一个接口,连接数据库的一个接口

       1.在没有JDNI时的用法:

    我现在目前用的数据库是oracle,对于一个程序员来说为了连接数据库的前提条件我们先得到它的DRIVERCLASS来加载驱动,URL,UNAME,UPASS来创建数据库连接

   private static final String  DRIVERCLASS="oracle.jdbc.OracleDriver";
    private static final String URL="jdbc:oracle:thin:@localhost:1522:ORCL";
    private static final String UNAME="scott";
    private static final String UPASS="1234";
    //加载驱动
    static{
        try {
            Class.forName(DRIVERCLASS);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //创建数据库连接
    public static Connection getConn(){
        Connection conn=null;
        try {
            conn = DriverManager.getConnection(URL, UNAME, UPASS);
        } catch (Exception e) {
            e.printStackTrace();
        }
            
        
        return conn;
    }
    //关闭连接
    public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs){
        try {
            if(conn!=null && !conn.isClosed()){
                conn.close();
            }
            if(ps!=null){
                ps.close();
            }
            if(rs!=null){
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void closeAll(Connection conn,PreparedStatement ps){
        try {
            if(conn!=null && !conn.isClosed()){
                conn.close();
            }
            if(ps!=null){
                ps.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


然后我又在网上查找了关于如果我们没有运用JNDI时会遇到的问题

  1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
  2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
 3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;


解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

   2.运用JDNI方法之后

   配置的内容可以从Tomcat官网中找到

    在使用JDNI之前我们现需要配置文件,数据库连接池实现步骤
    <1>copy相对应的数据库jar到Tomcat/lib
    <2>添加以下配置信息到conf/context.xml

    //配置数据源( MySQL)

     更改掉,name,username,password,driverClassName,url

<Context ...>
  ...
  <Resource name="jdbc/EmployeeDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="dbusername"
            password="dbpassword"
            driverClassName="org.hsql.jdbcDriver"
            url="jdbc:HypersonicSQL:database"
            maxTotal="8"
            maxIdle="4"/>
  ...
</Context>
//配置数据源(ORACLE)
<Resource name="jdbc/news" auth="Container"
            type="javax.sql.DataSource"  maxActive="100"
            maxIdle="30" maxWait="10000" username="scott" password="tiger"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@localhost:1521:orcl"
            />

//引用数据源

  配置到web.xml文件中

<description>可写可不写</description>

<res-ref-name>这个数据源名字要与配置数据源中的name要一致</res-ref-name>

<resource-ref>
  <description>
    Resource reference to a factory for java.sql.Connection
    instances that may be used for talking to a particular
    database that is configured in the <Context>
    configuration for the web application.
  </description>
  <res-ref-name>
    jdbc/EmployeeDB
  </res-ref-name>
  <res-type>
    javax.sql.DataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>
配置完后我们可以在jsp页面上测试是否配置成功 
    <%
      Context context=new InitialContext();
     Context contextjava=(Context)context.lookup("java:/comp/env");
     DataSource dataSource=(DataSource)contextjava.lookup("bean/Porter");
    Connection conn=dataSource.getConnection();
    out.print(conn);
    %>

若出现如下的代码则配置成功

然后我们再去引用我们的数据源

     public static Connection getConn(){
         try {
            Context context=new InitialContext();
        Context contextjava=(Context)context.lookup("java:comp/env");
         DataSource dataSource=(DataSource)contextjava.lookup("jdbc/zking160628DB");
        return dataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
         return null;
     }
     public static void getClose(Connection conn,PreparedStatement ps,ResultSet rs){
         try {
            if(conn!=null&&!conn.isClosed()){
                 conn.close();
             }
            if(ps!=null){
                ps.close();
            }
            if(rs!=null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
     }



展开阅读全文

没有更多推荐了,返回首页