前言:

       在上一节中,我们介绍了《Spring Boot JNDI:这是虾米?》,为了大家更好的理解什么是JNDI,这里就带大家一起看看,在Tomcat中是如何玩JNDI的。

       Tomcat配置JNDI有全局配置和局部配置。大致的有以下三种配置方式:

(1)全局配置:基于context.xml的配置。

(2)局部配置:基于server.xml的配置。

(3)局部配置:基于META-INF 的配置。

 

第一种:全局配置:基于context.xml的配置

1)在tomcat的conf/context.xml配置文件中加入(代码支持左右滑动):

 

<?xml version="1.0" encoding="UTF-8"?>
<Context >  
<Resource name="jdbc/mydb" 
     auth="Container" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/mydb" 
     username="root" password="root" 
     maxActive="20" maxIdle="10" 
     maxWait="10000"/>
</Context>

 

特别注意:如果是使用了eclipse进行开发测试的话,可能会碰到如下的异常信息:

Cannot create JDBC driver of class '' for connect URL 'null'

      这是由于context.xml是在开发工具中的servers下的/context.xml,所以需要将配置信息配置servers/Tomcat/context.xml。

springboot项目可以配置域名吗 springboot配置jndi_数据库

2)在项目的web.xml中加入资源引用(非必须的):

<resource-ref>   
        <description>DB Connection</description>   
        <res-ref-name>jdbc/mydb</res-ref-name>   
        <res-type>javax.sql.DataSource</res-type>   
        <res-auth>Container</res-auth>   
    </resource-ref>

其中res-ref-name值要和context.xml的name值一致。

特别说明:这个配置是可有可无的,不配置这个的话,也是可以正常运行的。

3)在jsp中调用加载jndi方式:

Connection conn =null;
      try{
           //初始化查找命名空间
           Context ctx = new InitialContext(); 
           //InitialContext ctx = new InitialContext();亦可 
           //找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟你的DataSource名
           DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mydb");
           //取出连接
            conn = ds.getConnection();
           String sql = "select *from test";
           PreparedStatement ps = conn.prepareStatement(sql);
           ResultSet rs = ps.executeQuery();
            while(rs.next()){
                 System.out.println("id:"+rs.getInt("id")+",name:"+rs.getString("name")+"");
            }
           out.println(conn);
           out.println(conn.isClosed());
           out.println("</br>");
            System.out.println("connection pool connected !!");   
      } catch (NamingException e) {
       System.out.println(e.getMessage());
      } catch (SQLException e) {
       e.printStackTrace();
      }finally{
           //注意不是关闭,是放回连接池.
           conn.close();
      }

特别注意:不可以直接用main方法测试,必须通过启动容器从jsp中调用

第二种:局部配置:基于server.xml的配置(不推荐使用)

在tomcat的server.xml的<host>标签内,添加:

<Context docBase="demo-jndi" path="/demo-jndi">
           <Resource name="jdbc/mydb" 
             auth="Container" 
             type="javax.sql.DataSource" 
             driverClassName="com.mysql.jdbc.Driver" 
             url="jdbc:mysql://localhost:3306/mydb" 
             username="root" password="root" 
             maxActive="20" maxIdle="10" 
            maxWait="10000"/>
          </Context>

其他配置同第一种方式。

第三种:局部配置:基于META-INFO的配置

在项目的META-INF 下面新建context.xml加入:

<?xml version="1.0" encoding="UTF-8"?>
<Context >  
<Resource name="jdbc/mydb" 
     auth="Container" 
     type="javax.sql.DataSource" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/mydb" 
     username="root" password="root" 
     maxActive="20" maxIdle="10" 
     maxWait="10000"/>
</Context>

其他配置同第一种方式。

 

总结:

如果要配置局部的话,推荐使用第三种方式,这样不依赖tomcat了。但是还是推荐使用第一种方式好,虽然依赖Tomcat,但是是全局的,而且可以配置多个。对于以后切换使用方便。另外在项目的web.xml中添加的资源引用可有可无。