设为首页 收藏本站
查看: 596|回复: 0

[经验分享] JNDI与tomcat连接池

[复制链接]

尚未签到

发表于 2017-1-26 06:06:02 | 显示全部楼层 |阅读模式
   
  本章内容
  ² JNDI与JNDI服务器
  ² 编码实现JNDI目录服务与命名服务
  ² 使用Tomcate JNDI服务器
  一、JNDI概述
  1、什么是JNDI?
  英文全称是:Java Naming and Directory Interface
  命名服务提供了一种为对象命名的机制,这样你就可以在无需知道对象位置的情况下获取和使用对象。只要该对象在命名服务器上注册过,且你必须知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。就可以找到该对象,获得其引用,从而运用它提供的服务。
         利用JNDI可以寻找在命名服务器上注册过的所有对象。
  JNDI就是为JAVA中命名和目录服务定义的JAVA API,是命名服务的抽象机制。我们可以直接通过JNDI来操作命名服务,而不要与底层的命名服务器交互,大大减轻了程序员的压力。
   2、什么是JNDI server?
        能提供目录或命名服务的服务器,相当于数据库。
        常见JNDI服务器:DNS、XNam 、Novell目录服务、
        LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 
        CORBA对象服务、
        Tomcat数据源
        EJB容器的Bean对象(通过jdni技术访问)
        文件系统、
        Windows XP/2000/NT/Me/9x的注册表、
        RMI、DSML v1&v2、NIS 
  3、为什么要使用JNDI?
  解决多个应用程序访问同一个资源的问题。
DSC0000.png

  二、通过编码了解JNDI,完成对文件系统的操作
  JNDI包:
  javax.naming:命名操作;
  javax.naming.directory:目录操作; 
  JNDI常用类:
  javax.naming.Context;(接口)
  javax.naming.NamingEnumeration;(枚举类)
  javax.naming.InitialContext;(Context实现类)
  1、创建一个目录服务器
  需要的包:
  fscontext.jar;
  providerutil.jar
  commons-logging.jar
  naming-resources.jar
  naming-factory-dbcp.jar
           编写JndiFile类,显示结果为此路径下所有的资源名与类型。
       关键代码:
  public static void main(String[] arg)throws Exception{
      Hashtable ev=new Hashtable();
      //指定提供命名服务的类名 ev.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");
      //指定提供命名服务的服务器位置信息(远程命名服务器要提供IP和端口号)
      ev.put(Context.PROVIDER_URL,"file:///d:/");
      //初始化命名目录的上下文
     Context ctx=new InitialContext(ev);
      //列举命名服务器根目录下的所有对象
      NamingEnumeration  list=ctx.list("/");
      //显示所有对象的信息
      while(list.hasMore()){
      //NameClassPair表示存在于上下文中的某一绑定的对象名称和类名称对
      NameClassPair nc = (NameClassPair) list.next();
  System.out.println(nc);
      }
  }
  2、通过JNDI从目录服务器中取出一个文件
  从Jndi Context中查找一个文件使用的方法:
   lookUp(String name)
        lookUp(javax.name.Name )
  两个方法用来在Context中查找资源。
  关键代码如下:
  public static void main(String[] arg)throws Exception{
      Hashtable ev=new Hashtable();
      //指定提供命名服务的类名    ev.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");
      //指定提供命名服务的服务器位置信息(远程命名服务器要提供IP和端口号)
      ev.put(Context.PROVIDER_URL,"file:///d:/");
      //初始化命名目录的上下文
     Context ctx=new InitialContext(ev);
      //列举命名服务器根目录下的所有对象
     File file = (File)ctx.lookup("/wms/readme.txt");
      //缓冲字符流读取对象
     BufferedReader br = new BufferedReader(new FileReader(file));
     //读取文件信息
     String line = br.readLine();
     while(line != null){
        System.out.println(line);
        line = bw.readLine();
       }
  }
  3、编码实现Java命名服务器
  利用bind()和unBind()方法绑订和撤消绑订对象。
  代码:
  public static void main(String[] arg) throws Exception {
  Hashtable ev = new Hashtable();
  //指定提供命名服务的类名
  ev.put(Context.INITIAL_CONTEXT_FACTORY,
  "org.apache.naming.java.javaURLContextFactory");
  //初始化命名目录的上下文
  Context ctx = new InitialContext(ev);
  //取得文件对象
  File file = new File("E:/bbb.txt");
  //在服务器上绑定file,注册名为bbb
  ctx.bind("bbb", file);
  //在服务器上查找bbb对象
  Object o = ctx.lookup("bbb");
  //输出对象的类名
  System.out.println(o.getClass().getName());
  ctx.unbind("bbb");
  Object o1 = ctx.lookup("bbb");
  }
  三、tomcat连接池
  web服务器也是一个jndi服务器
  在Tomcate中配置数据源,在项目中利用JNDI去访问
  1、在Tomcat5.5上配置数据源
  在server.xml中配置如下节点
<!-- Context节点的path属性就是你的WebApp服务名,与上面同。
 例如:http://localhost:8080/YouWeb/index.jsp 这个是访问你网站的URL,那么你的path就是: /YouWeb
-->
  u 私有数据库连接池(Host节点里面)
  <Context path="/YouWeb" docBase="F:\workspace\tea_forum\WebRoot">
     <Resource
       name="jdbc/sqlserver"
       type="javax.sql.DataSource"
       driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"
       maxIdle="2"
       maxWait="5000"
       username="sa"
       password="sa"
       url="jdbc:odbc:accp"
       maxActive="4"/>
  </Context>
  u 公有数据库连接池
     配置公有数据库连接池(GlobalNamingResources节点里面)
      <Resource
       name="jdbc/mssql"
       type="javax.sql.DataSource"
       driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"
       maxIdle="2"
       maxWait="5000"
       username="sa"
       password="sa"
       url="jdbc:odbc:accp"
       maxActive="4"/>
     引用公有数据库连接池(Host节点里面)
  <Context    path="/testjndi1" docBase="F:\workspace\testpool\WebRoot" >  
      <ResourceLink name="jdbc/mssql1" global="jdbc/mssql" type="javax.sql.DataSource"/>
  </Context>
  <Context    path="/testjndi2" docBase="F:\workspace\testpool2\WebRoot">  
      <ResourceLink name="jdbc/sqlserver2" global="jdbc/mssql" type="javax.sql.DataSource"/>
  </Context>
  解释一下:
   1.path是指定访问该web应用的URL入口;
   2.docBase指定web应用的文件路径,可以是绝对路径,也可以是相对于Host的appBase属性的相对路径;
   3.type是指数据源类型
   4.maxActive是DBCP中处于活动状态的数据库连接的最大数目,取0表示不受限制
   5.maxIdle是DBCP中处于空闲状态的数据库连接的最大数目,取0表示不受限制
   6.maxWait是是DBCP中的数据库连接处于空闲状态的最长时间(以毫秒为单位)取0表示无限期等待
   7.username是数据库登陆名
   8.password是数据库登陆口令
   9.driverClassName是只定数据库的jdbc驱动程序
   10.url是指定连接数据库的URL,testDBCP是我的数据库名。
  
2、在你的项目工程目录WEB-INf\web.xml中配置如下信息:
<!--注意:res-ref-name节点里的名字要与上面的Resource节点里的name要一致。名字可以任意取,但一定要一致。-->
 <resource-ref>
     <res-ref-name>jdbc/sqlserver</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
 </resource-ref>
3、最后,在你和程序中使用如下代码即可取得连接:
     InitialContext ctx = new InitialContext();
     //这里的java:comp/env是前缀,java语言规范,后面跟的是你Web.xml文件中res-ref-name              节点中的名字。
       DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/server");
     Connection conn = ds.getConnection();
   
   **注意:这里不能用java application演示
  4、JSP测试文件
  <%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page contentType="text/html;charset=GB2312"%>
<html>
<head>
   <title>
    tomcat 连接池
   </title>
</head>
<body bgcolor="#ffffff">
   <h3>
    test
    <br>
    连接池:
   </h3>
   <%try {
    
     Context initCtx = new InitialContext();
     Context envCtx = (Context) initCtx.lookup("java:comp/env");
     DataSource ds = (DataSource) envCtx.lookup("jdbc/sqlserver");
      
     Connection conn = ds.getConnection();
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("select * from test");
     while (rs.next()) {%>
     <br>
   <%=rs.getString(1)%>
   <%}%>
   <%out.print("<br>Successful!成功!!\n");%>
   <%rs.close();
     stmt.close();
     conn.close();
    } catch (Exception e) {
     out.print("出现例外!" + e.getMessage());
     e.printStackTrace();
    }
     %>
  </body>
</html>
  启动tomcat后 点击http://localhost:8080/testDBCP/index.jsp因该可以看到成功页面.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-333399-1-1.html 上篇帖子: Tomcat目录映射设置 下篇帖子: 浅析Tomcat之AprEndpoint
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表