一.JNDI 和JDBC的区别和联系
两者都是API,是连接数据库的标准。并不是什么产品或方法。

二.JDBC

全称:Java Database Connectivity

以一种统一的方式来对各种各样的数据库进行存取
使用JDBC带来的问题:
(1).数据库服务器名称 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改
(2).数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改
(3).随着实际使用终端的增加,原配置的连接池参数可能需要调整

使用方法:

(1)加载数据库驱动,填写数据库url,用户名,密码

(2)在程序中进行调用

三.JNDI

Java
Naming and Directory Interface

它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP

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

使用方法:

tomcat下jndi的两种配置方式

(一).非全局的JNDI配置:只针对某一个Web项目的数据源的配置

1.导入要链接数据库的jar包文件

例如:

sqlserver导入:sqljdbc4.jar包

oracle导入:ojdbc14.jar包

mySQL导入:mysql-connector-java-5.0.8.jar包

2.在JNDI中配置数据库的连接池

在WEB项目中的META-INF中创建一个context.xml文件。用于设置数据库的连接池信息

例如(mysql):

 <?xml version="1.0" encoding="UTF-8"?>
<Context>
<!--
JNDI数据源配置
J2EE服务器上保存着一个数据库的多个连接(连接池中),
数据源被绑定在了JNDI树上,
每一个DataSource都有一个name,
客户端通过name找到在JNDI树上绑定的DataSource,
再由DataSource找到一个连接
|- name:表示以后要查找的名称。通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是此名称,
|- auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效,可以使用Container
|- type:此名称所代表的类型,现在为javax.sql.DataSource(不用变)
|- maxActive:表示一个数据库在此服务器上所能打开的最大连接数
|- maxIdle:表示一个数据库在此服务器上维持的最小连接数
|- maxWait:最大等待时间。10000毫秒
|- username:数据库连接的用户名
|- password:数据库连接的密码
|- driverClassName:数据库连接的驱动程序
|- url:数据库连接的地址
-->
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="whr110112119"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf-8"/>
</Context>

3.在web.xml文件中进行配置(可配置也可以不配置)

如果要配置的话:

1.    <resource-ref>
2. <description>my DB Connection</description>
3. <res-ref-name><span style="font-family: Arial, Helvetica, sans-serif;">jdbc/sqlserver</span><span style="font-family: Arial, Helvetica, sans-serif;"></res-ref-name>这个名字要与context.xml中的name一样</span>
4. <res-type>javax.sql.DataSource</res-type>
5. <res-auth>Container</res-auth>
6. </resource-ref>

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

4.如果使用Spring的情况下

在applicationContext.xml或者自己的Spring的配置文件中导入JNDI的配置信息

 //获得content.xml中JNDI配置的数据库的连接池信息。jndi-name必须与JNDI中的name值一样
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/mysql" />
//使用JdbcTemplate操作数据库。
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>

在java文件中使用IOC得到jdbcTemplate对象。最后使用jdbcTemplate操作数据库

jndi测试方法:

1.    public void testJNDI() throws NamingException, SQLException{
2. Context ctx = new InitialContext();
3. DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql ");
4. Connection conn = ds.getConnection();
5. System.out.println(conn.isClosed());
6. }

在jsp中调用加载jndi方式(不可以直接用main方法测试,必须通过启动容器从jsp中调用):

写测试的jsp,例如:jndiTest.jsp

1.    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2. <%@page import="com.apply.test.JNDITest"%>
3. <%
4. // 调用JNDITest类的testJNDI方法进行测试
5. JNDITest test = new JNDITest();
6. test.testJNDI();
7. out.println("connection pool connected !!");
8. %>
9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
10. <html>
11. <head>
12. <title>jndi配置测试</title>
13. </head>
14. <body>
15. </body>
16. </html>

5.如果不使用Spring的话,可以在java文件中直接使用:

   //JNDI方式
  Context ctx = new InitialContext();
  //获取数据源
  DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
  //通过数据源取连接池中的连接
  conn = ds.getConnection();

(二)全局的JNDI配置

1.在tomcat的安装目录下的conf下的server.xml文件中的GlobalNamingResources标签下加入resource配置信息(局部JNDI在context.xml文件中的resource配置信息)

2.在Web项目中的META-INF下的context中配置

 //global中的名字要与server.xml中的名称一样,而这里的name表示当前要使用名称
<ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSource"/>

3.剩下的和配置局部JNDI一样,及第3,第4,第5配置完直接使用就可以了

总结:

如果要配置局部的话,推荐使用第一种方式,这样不依赖tomcat了

但是还是推荐使用第二种方式好,虽然依赖tomat,但是是全局的,而且可以配置多个,对于以后切换使用方便

在项目的web.xml中添加的资源引用可有可无

 

JNDI和JDBC的区别和联系及其使用方法的更多相关文章

  1. JNDI 和JDBC的区别

    1.JNDI 和JDBC的区别和联系.两者都是API,是一个标准.并不是什么产品或方法.JDBC 全称:Java Database Connectivity 以一种统一的方式来对各种各样的数据库进行存 ...

  2. JNDI和JDBC的区别-个人理解

    网上关于JNDI和JDBC的定义有很多,但是都很官方不容易理解,下面是我最近查阅资料得出的心得体会.希望对你在理解上有一点点的帮助,说的不对的请指正哦. JDBC: 看到最多的就是 Java Data ...

  3. JNDI和JDBC的区别

    最近也是遇见了JNDI这个概念,查了一下,网上的说法太官方,所以参考下一位老哥的博客总结下 JDBC 看到最多的就是,Java Database Connectivity (JDBC)是一个标准的Ja ...

  4. 使用JNDI或JDBC连接数据库

    一. JNDI 1. tomcat环境 找到X:\xxx\......\apache-tomcat-6.0.39\conf\server.xml,在<Host>节点中配置如下: <H ...

  5. 简述 Hibernate 和 JDBC 的区别、优缺点

    1.hibernate是一个开源的.采用面向对象的思想实现ORM映射框架,它对jdbc进行了一层封装,对于数据库的连接.关闭.数据的持久化(增删改查).事务的管理都进行了封装,使得程序开发的时候可以用 ...

  6. tomcat中配置servlet.xml的JNDI或JDBC连接数据库【原】

    tomcat中配置servlet.xml的JNDI或JDBC连接数据库 一. JNDI 1. tomcat环境 找到X:\xxx\......\apache-tomcat-6.0.39\conf\se ...

  7. 使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...

  8. 二.OC基础--1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题

    1,对象的存储细节, 1. 当创建一个对象的时候:Person *p1 = [Person new],做了三件事情: 1,申请堆内存空间: 2,给实例变量初始化: 3,返回所申请空间的首地址; 2. ...

  9. JDBC使用游标实现分页查询的方法

    本文实例讲述了JDBC使用游标实现分页查询的方法.分享给大家供大家参考,具体如下: /** * 一次只从数据库中查询最大maxCount条记录 * @param sql 传入的sql语句 * @par ...

随机推荐

  1. 在控制台中 使用memcache

    控制台的代码 在memcache 中查询 hans,结果显示如下 :

  2. svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码

    执行svn update 时 总是提示输入密码. $ cd ~/.gnome2/keyrings/ $ ls $ rm 默认密钥.keyring

  3. javaweb基础(39)_数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  4. P1069 细胞分裂

    P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...

  5. 流形(Manifold)初步

    原文链接 欧几里得几何学(Euclidean Geometry) 两千三百年前,古希腊数学家欧几里得著成了<几何原本>,构建了被后世称为“欧几里得几何学”的研究图形的方法.欧几里得创立了当 ...

  6. es6-promise.auto.js

    使用sweetalert2的IE浏览器报错,导入文件 链接:https://pan.baidu.com/s/1mOcsN_o8m-7I7Rej1NPkiw 提取码:9xsj

  7. java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)

    今天开始就来总结一下Java多线程的基础知识点,下面是本篇的主要内容(大部分知识点参考java核心技术卷1): 1.什么是线程以及多线程与进程的区别 2.多线程的创建与启动 3.中断线程和守护线程以及 ...

  8. java乱码问题

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

  9. Python简单线程间通信

    本节主要举一个简单的线程间通信的例子,利用线程安全的数据结构queue.Queue保存线程间通信的内容, import queue from threading import Thread from ...

  10. SAP BI 常用TCODE

    S.No Tcode Description 1 RSA1 Administrator Work Bench 2 RSA11 Calling up AWB with the IC tree 3 RSA ...