专栏首页陈树义Tomcat配置JNDI数据源

Tomcat配置JNDI数据源

本文将介绍Tomcat配置JNDI数据源的方法,主要分为配置局部数据源(仅供单个应用使用)和全局数据源(所有用该Tomcat的应用都可以使用)

一、思考

从我们学习Web开发以来,我们都是通过程序代码来实现数据库的访问的。从一开始直接将数据库配置信息写在代码中,到后来将配置信息抽取出来写在了Properties文件中,我们访问数据库的代码更加精简。

而通过JNDI方式访问数据库则更为直接,JNDI连接数据库的方式直接将数据库信息放在Tomcat中,而项目代码里直接通过JNDI技术就可以得到数据源。他们之间通过定义在Tomcat中的数据源名联系起来。

应该说,JNDI方式配置数据源将项目代码与实施部署分离开来了,有利于开发人员和实施部署人员各司其职。

二、配置方式

一般情况下,局部数据源直接配置在项目对一个的<Context>标签内,如下:

<Context docBase="S:\Workspaces\ServletProject\WebRoot" reloadable="true" >
    <Resource name="jdbc/dstest" auth="Container" type="javax.sql.DataSource" maxActive="5" maxIdle="2" maxWait="10000" username="root" password="root" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:dbName"/>
</Context>

注:根据项目配置方式不同,可以配在servlet.xml中或conf/Catalina/localhost下的独立xml文件中

而全局数据源,则需要先在<GlobalNamingResources>标签内添加<Resource>数据源,然后在项目部署的<Context>标签内用<ResourceLink>引用对应的<Resource>标签,如下:

 1 <!-- 在GlobalNamingResources中添加数据源 -->
 2 <GlobalNamingResources>
 3     <!-- 省略其他  -->
 4     <Resource name="jdbc/dstest" auth="Container" type="javax.sql.DataSource" maxActive="5" maxIdle="2" maxWait="10000" username="root" password="root" driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:dbName"/>
 5   </GlobalNamingResources>
 6 
 7 <!-- 在项目部署Context中引用数据源 -->
 8 <Context docBase="S:\Workspaces\ServletProject\WebRoot" path="" >   
 9              <ResourceLink name="jdbc/dstest" global="jdbc/dstest" type="javax.sql.DataSource"/>
10         </Context>

注:1、这里第4行和第9行的name属性必须相同。

 2、配置好全局数据源后,你不仅可以在server.xml文件中用<ResourceLink>引用,你也可以在conf/Catalina/localhost中的xml文件中引用。

选择局部数据源还是全局数据源完全取决你自己的需求,如果你经常 有几个项目需要用到同一个数据源,那么你可以使用全局数据源,然后在项目的<Context>标签中引用,这样可以避免重复书写<Resource>内容。

三、测试

1、第三步所写的任一种方式配置好数据源。

2、配置完数据源之后,你还要把对应的数据库驱动文件放在项目的lib目录或者tomcat的lib目录下。

3、接着,我们写一个简单的Bean,Bean里进行数据库的连接。我们会在JSP页面上调用这个Bean并输出结果,以查看数据源是否配置成功。

JNDIBean.java文件

package com.chanshuyi.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class JNDIBean {
    
    public String getInfoByJNDI()
    {
        String result = "";
        
        try
        {
            Context ctx = new InitialContext();
            /* 在XML文件中定义的数据源名为:jdbc/dstest */
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/dstest");
            Connection conn = ds.getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("select * from t_yw_product where trueid = '260'");
            while(rs.next())
            {
                result += rs.getString("finaluser") + "<br/>";
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return result;
    }
}

JNDITest.jsp文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<jsp:useBean id="jndiBean" class="com.chanshuyi.test.JNDIBean"></jsp:useBean>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
    <head></head>
    <body>
        <h1>Hello World !</h1>
        <%=jndiBean.getInfoByJNDI()%>
    </body>
</html>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringMVC DispatcherServlet执行流程及源码分析你要知道的SpringMVC DispatcherServlet执行流程及源码分析都在这里

    你要知道的SpringMVC DispatcherServlet执行流程及源码分析都在这里 转载请注明出处 https://cloud.tencent.com/...

    WWWWDotPNG
  • 从头学一次J2EE笔记

    1、在Servlet3.5规范之前,Java Web 应用的绝大部分组件都通过web.xml 文件来配置管理, Servlet3.0 规范可通过Annotati...

    陈树义
  • 使用Java内置的Http Server构建Web应用

    一、概述 使用Java技术构建Web应用时, 我们通常离不开tomcat和jetty之类的servlet容器,这些Web服务器功能强大,性能强劲,深受欢迎,是运...

    用户1608022
  • jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

    一、连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必...

    欠扁的小篮子
  • 浅谈Struts2

    学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2。 为什么要用Struts2? 这里列举一些Servlet的缺点: 1、每写...

    欠扁的小篮子
  • servlet设置缓存时间以及文件的下载

    缓存时间的设置: 1 public void doGet(HttpServletRequest request, HttpServletResponse res...

    欠扁的小篮子
  • Java面试题:Servlet是线程安全的吗?

    Servlet不是线程安全的。 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的。 当Tom...

    陈树义
  • Servlet响应的中文字符集问题

    在Servlet中利用response向客户端浏览器输出中文时有时会遇到乱码问题,总结如下: response输出流有两种,一是以字节流输出,一是以字符流输出。...

    欠扁的小篮子
  • 数据的分页处理

    当页面中要显示的内容过多需要分多页显示、或是数据量过大内存吃不消时,需要分页处理。 原理:每次从数据库中取出一定量的数据,通过jsp页面显示 实现: ①写一个类...

    欠扁的小篮子

扫码关注云+社区

领取腾讯云代金券