本章内容
² 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?
解决多个应用程序访问同一个资源的问题。
二、通过编码了解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因该可以看到成功页面.
相关推荐
这是一个关于如何启用Tomcat自带的连接池功能的小例子,里面用到了JNDI的查找
基于JNDI的应用程序开发 在以TOMCAT为WEB服务器的项目中,用JNDI建立数据库连接池实例.
Tomcat中配置jndi数据源连接池(自己写的) 做过实用 没有问题
NULL 博文链接:https://jackyin5918.iteye.com/blog/1922379
在分析数据库连接池工作原理的基础上,给出了Tomcat服务器数据库连接池的配置实例,以及在JSP页面中使用此连接池进行数据库访问的Java代码。在大型Web站点的开发中,使用数据库连接池技术是必要的,也是可取的。
在tomcat中使用数据库连接池,方式:jndi配置
在tomcat6.0和MySQL5的环境下能运行成功,内含详细的说明和需要用到的文件,不能运行的话加QQ:459789479
讲述tomcat5.0和tomcat5.5.12配置连接池(JNDI)的不同配置方法
Tomcat5配置MysqlJDBC数据库连接池(JNDI方式)
c3p0配置数据库连接池、数据库连接池 已经测试通过,可以提供给新入门的朋友学习之用,如果是要结合spring就不用下载了,网上其他地方应该很多资料,简单修改一下,原理都是一样的。
经过实践归纳的,参考了tomcat6.0关于配置JNDI的官方文档。经过测试可以配置成功和使用。
结合实例,详细讲述tomcat6下连接池的配置与使用
用dbcp连接池,mysql数据库,在tomcat服务器下,通过hibernate配置jndi数据源. 我想此标题已经比较明确了。 在此说明一点,hibernate开发小组不推荐在hibernate下使用dbcp,如果一定要的话,请慎重考虑。
对应java代码中获得连接方法:(代码摘要) private Connection dbcon; Context ic = new InitialContext(); DataSource source = (DataSource) ic.lookup("java:comp/env/jdbc/jndidemo"); dbcon = source.get...
Tomcat下配置JNDI数据库连接池并使用 一、配置JNDI数据源 这一步有几种配置方式,比如直接修改Tomcat/conf/server.xml文件,但这样修改是全局的,个人不太喜欢这样的方式,本着的原则是能不全局不全局,以保证...
主要用于tomcat连接池和struts连接池!
数据库连接池配置 <br>环境:xp2+IE7.0+tomcat5.028+mysql5.018 <br>1.假定tomcat 安装目录为:D:\Tomcat5 <br>2.假定程序目录为: D:\web\WebRoot <br> 目录设置请看WebRoot.xml 中有下面这句代码:...
我比较倾向于直接在web应用... 也是说我们希望每个应用服务器只有一个连接池的实例,在这个应用服务器上运行的所有项目都可以使用这个连接池,下面介绍这种方式在Tomcat和Resin下的配置。 Tomcat使用JNDI Resourc
jndi获取数据库连接,当前软件版本tomcat8jdk8. Tomcat 为每个在其上运行的 Web 应用都提供了一个 JNDI 的 ...Tomcat中的默认数据源支持基于Commons 项目中的DBCP 1.x连接池,也可以使用实现任何其他连接池