jdbc 和 jndi 的关系

 Java Database Connectivity(JDBC)JDBC以一种统一的方式来对各种各样的数据库进行存取。和ODBC一样,JDBC为开发人员隐藏了不同数据库的不同特性。另外,由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。JDBC定义了4种不同的驱动程序:JDBC-ODBCBridge、JDBC-native driverbridge、JDBC-networkbridge、PureJavadriver。在一个多层的企业级应用中,更大的可能是在客户端和一个EJB进行通信,采用EJB建立数据库连接。为了实现和改进可伸缩性和系统性能, 也可以采用连接缓冲池(connection pool)优化数据库连接。

Java Naming and Directory Interface (JNDI)JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP,本地文件系统,后者在应用服务器中的对象。在JNDI中,在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。应用可以通过这个初始化的context经有这个目录树来定位它所需要的资源或对象。(这句话什么意思呢?是这样的:

JNDI 对应于J2SE中的javax.naming包,这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。 

其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。


JNDI的结构:
JNDI的结构自上而下包含3个主要层次:
1)应用层:该层使用JNDI API
2)JNDI API层:该层定义一组类和接口,可以用来访问任何命名或目录服务。
   JNDI类库包含在 java2 SDK中,主要包含如下程序包:

1、用于命名操作的javax.naming;
2、用于目录操作的javax.naming.directory
3、在命名和目录服务器中请求事件通知的javax.naming.event;
4、提供LDAP支持的javax.naming.ldap
3)实现层:该层为JNDI SPI API及其具体实现,它包括以下几个命名/目录服务器提供者:LDAP,CORBA,RMI,DNS等。

JNDI命名与上下文:
  JNDI命名服务对象映射为名称,这种映射可以获得远程对象的引用,以及调用远程对象的方法,而不必知道该对象在网络上的物理地址。可以使用javax.naming程序包来访问JNDI命名服务,这个程序包包括如下命名方法: 获得初始上下文,把对象绑定到名称上,查找对象等。

 在命名系统中,上下文作为查找对象过程的起点。在文件系统中,每个目录都可以看做是一个上下文。JNDI API定义了Context接口,该接口在JNDI中起着重要作用。JNDI还定义了InitialContext类,要执行任何操作,必须建立一个InitialContext。

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

理解连接池

连接池技术能显著增加Java应用程序的性能,同时还能降低资源使用率。连接池技术的主要优点包括:

·         缩短了连接创建时间

与其他数据库相比,MySQL提供了快速的连接设置功能,连接时间通常不是问题,但创建新的JDBC连接仍会导致联网操作和一定的IDBC驱动开销,如果这类连接是“循环”使用的,使用该方式,可避免这类不利因素。

·         简化的编程模型

使用连接池技术时,每个单独线程能够像创建了自己的JDBC连接那样进行操作,从而允许使用直接的JDBC编程技术。

·         受控的资源使用

如果不使用连接池技术,而是在每次需要时为线程创建新的连接,那么应用程序的资源使用将十分浪费,而且在负载较重的情况下会导致无法预期的结果。连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

幸运的是,Sun公司通过JDBC-2.0“可选”接口,完成了JDBC中连接池概念的标准化实施,所有主要应用服务器均实施了能够与MySQL Connector/J一起良好工作的这类API。

通常,你可以在应用服务器的配置文件中配置连接池,并通过Java命名和目录接口(JNDI)访问它。在下面的代码中,介绍了在J2E应用服务器上运行的应用程序中使用连接池的方法:

示例26.12. 与J2EE应用服务器一起使用连接池

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class MyServletJspOrEjb {

    public void doSomething() throws Exception {

        /*

         * Create a JNDI Initial context to be able to  lookup the DataSource

         *

         * In production-level code, this should be cached as  an instance or static variable, as it can  be quite expensive 

         * to create a JNDI context.(创建一个JNDI context是非常昂贵的资源耗费)

         *

         * Note: This code only works when you are using servlets or EJBs in a J2EE application server. If you are

         * using connection pooling in standalone Java code, you will have to create/configure datasources using whatever

         * mechanisms your particular connection pooling library  provides.

         */

        InitialContext ctx = new InitialContext();

         /*

          * Lookup the DataSource, which will be backed by a pool that the application server provides. DataSource instances

          * are also a good candidate for caching as an instance variable, as JNDI lookups can be expensive as well.

          */

        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");

        /*

         * The following code is what would actually be in your  Servlet, JSP or EJB 'service' method...where you need

         * to work with a JDBC connection.

         */

        Connection conn = null;

        Statement stmt = null;

        try {

            conn = ds.getConnection();

            /*

             * Now, use normal JDBC programming to work with MySQL, making sure to close each resource when you're

             * finished with it, which allows the connection pool  resources to be recovered as quickly as possible

             */

            stmt = conn.createStatement();

            stmt.execute("SOME SQL QUERY");

            stmt.close();

            stmt = null;

            conn.close();

            conn = null;

        } finally {

            /*

             * close any jdbc instances here that weren't explicitly closed during normal code path, so

             * that we don't 'leak' resources...

             */

            if (stmt != null) {

                try {

                    stmt.close();

                } catch (sqlexception sqlex) {

                    // ignore -- as we can't do anything about it here

                }

                stmt = null;

            }

            if (conn != null) {

                try {

                    conn.close();

                } catch (sqlexception sqlex) {

                    // ignore -- as we can't do anything about it here

                }

                conn = null;

            }

        }

    }

}

如上例所示,获得JNDI InitialContext并查找到数据库后,其余代码与过去在JDBC编程中使用的类似。

使用连接池时需要牢记的最重要事项是,无论在代码中出现了什么(异常、控制流等),连接以及由连接创建的任何部分(语句、结果集等)均应被关闭,以便能再次使用它们。如不然,它们将纠缠在一起,在最好的情况下,意味着它们所代表的MySQL服务器资源(缓冲区、锁定、套接字等)可能会捆绑一段时间,在最坏的情况下,可能会导致永久捆绑。

连接池的最佳大小是什么?

与所有其他配置经验规则一样,回答是“它取决于具体情况”。尽管最佳大小取决与预期的负载和平均的数据库事务时间,最佳的连接池大小小于你的预期。例如,如果使用的是Sun公司的Java Petstore Blueprint应用程序,对于包含15~20个连接的连接池,使用MySQL和Tomcat,在可接受的相应时间下,可服务于中等程度的负载(600个并发用户)。

要想确定用于应用程序的连接池大小,应使用诸如Apache Jmeter或The Grinder等工具创建负载测试脚本,并对应用程序进行负载测试。

确定出发点的一种简单方法是,将连接池的最大连接数配置为“无限”,运行负载测试,并测量最大的并发连接数。随后,应进行反向操作,确定出使应用程序具有最佳性能的连接池的最小和最大值。

什么是命名服务?

命名服务在一个集中位置存储信息,这样用户、计算机和应用程序便可通过网络进行通信。命名服务使用名称查找对象,而不是对象的物理ID。比如说在tomcat中查找JDBC数据源不是通过数据源的直接引用查找,而是通过JNDI与数据源绑定的名称查找(这句话,验证了我之前的猜想:JNDI这种命名服务接口,绑定了使用jdbc配置的数据源,正因为有了java命名和目录服务 即JNDI,所以用户只需要知道这个数据源的名称,就能调用该数据源,完成对数据库的连接操作),比如说通过DNS可以使用域名来访问Web应用,而不是直接通过输入Web服务器的IP地址来访问,这里的数据源的引用和IP地址都可以看作是资源的物理ID。命名服务有DNS,NIS,LDAP等。DNS称为域名系统,开发 DNS 后,网络中的计算机可由通用名称而非 Internet (IP)地址来标识。NIS称为网络信息服务,NIS 的主要作用是通过对各种网络信息进行集中控制来更好地管理网络。NIS 存储有关网络、计算机名称和地址、用户、以及网络服务的信息。

什么是目录服务?

目录服务是命名服务的扩展,目录服务的对象不单有名称,还有属性,既可以通过名称查找对象,也可以通过属性查找到一批对象然后筛选出自己需要的对象。目录服务应该比命名服务更广发,它可以将整个网络中的资源和设备组织起来,形成一个大的目录,然后通过目录就可以定位资源和设备,实现集中管理。

tomcat或Jboss的数据源属于什么服务?

属于命名服务,因为tomcat和Jbosss容器提供了命名服务或者目录服务,然后编程人员想用使用它们的服务时假如没有JNDI则必须遵照它们定的规范来开发,显然两个容器的使用服务的方法是不一样的,所以才有JNDI的规范。也就是说命名和目录服务并不是因为编程而存在的,而是Web容器本身就具有的。

时间: 2024-11-03 20:57:26

jdbc 和 jndi 的关系的相关文章

Java中的命名与目录接口JNDI基本操作方法概览_java

对jndi总体的理解: jndi(java naming and directory Interface)它提供了一套使用命名和目录服务的接口.用户可以通过它来使用命名和目录服务.就像jdbc一样.jndi包括命名服务和目录服务两部分,其中目录服务包含目录对象directory object,它包含若干属性对象.提供了对属性的很多操作.命名和目录服务: 命名和目录服务我们一直在使用,如操作系统的文件系统,它给我们提供对文件的操作,查询,添加删除等功能.DNS服务将url同ip地址绑定在了一起.命

Java EE 6全新的功能和服务:上下文和依赖关系注入

在 Java 中,类可以拥有非原始类型的变量(字段).在复杂的应用程序中,这些字段的类型可以代表复杂的技术解决方案.例如,Record 类可以拥有类型为 javax.sql.DataSource 的字段,表示 Record 的一个实例将依赖关系型数据源才能正常工作.在 Java EE 中,您将通过 JNDI 查找一个实例,从而获取该数据源的一个实例.清单 1 中显示了一个示例. 清单 1. 使用 JNDI 获取对依赖关系的引用 Initialhttp://www.aliyun.com/zixun

界面-Java web中那些.class .jsp之类的文件的关系

问题描述 Java web中那些.class .jsp之类的文件的关系 要做一个javaweb登陆注册界面,那些Html.jsp.selvlet.和jdbc都是什么关系啊,感觉自己晕乎乎的 解决方案 不摘抄网上和教科书上的废话了,用最简单的话说说,希望你能理解: 一个网页,用户通过浏览器访问,浏览器是一个通用的软件,它只认识三样东西,css html 和 js(不是jsp),这些东西叫做前端. 其中html是从服务器上获取的,而无论是php jsp asp...不管是什么,本质上都是一个html

connection- Could not open JDBC Connection for transaction

问题描述 Could not open JDBC Connection for transaction org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create Poolab

jdbc接口及其驱动程序

1.定义: JDBC(jdbc的本质是接口,由sun公司定义) JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序. 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JD

MySQL为例讲解JDBC数据库连接步骤_Mysql

1.什么是JDBC?有什么作用? Java Data Base Connectivity Java数据库连接协议 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 他提供了一种基准,据此可以构建更高级的工具和接口,使开发人员能够编写数据库应用程序 有了JDBC, 向各种关系数据发送sql语句就变得很容易了 换句话说就是有了JDBC API就不用为了访问Oracle数据库专门写一个程序 或者又为访问MySQL数据库专门写一个程序. 2.Java APP使用JDBC连接

想成为一个JSP网站程序员吗

js|程序|程序员 任何Web开发人员需要必备的技巧主要有以下这些技术. 开发Web应用程序的技术已经变得更成熟.更复杂了.现在,构建一个Web应用程序不仅仅需要简单的HTML技术了.数据库访问.脚本语言和管理都是一个Web程序员需要具备的技术.让我们来看看要成为一个市场上受欢迎的Web开发人员都需要些什么技能吧. 自从CERN(欧洲粒子物理研究所),日内瓦附近的高能物理研究中心,在1991年发布了Web以来,Web技术已经从静态的内容和Common Gateway Interface(CGI)

JSP动态网页制作一定要知道的基础知识

js|动态|网页 一个普通的错误是把JSP当作简化的 Java.它不是,(事实上, JSP 是简化的 servlets .)程序员通常试着没有学习要求的支持技巧而 直接学习 JSP .JSP 是一个衔接技术,并且成功地连接你需要理解的另外的技术.如果你已经知道 Java , HTML 和 javascript,这意味着 JSP 将确实是简单的. 需要成为一个成功的 JSP 程序员可以参考这个时间表.请注意下列: *忽略你已经熟悉的步骤. *训练的时间只是代表学习好足够的基础时间,这样才能转移到下

指南:想成为一个JSP网站程序员吗?

js|程序|程序员   任何Web开发人员需要必备的技巧主要有以下这些技术. 开发Web应用程序的技术已经变得更成熟.更复杂了.现在,构建一个Web应用程序不仅仅需要简单的HTML技术了.数据库访问.脚本语言和管理都是一个Web程序员需要具备的技术.让我们来看看要成为一个市场上受欢迎的Web开发人员都需要些什么技能吧. 自从CERN(欧洲粒子物理研究所),日内瓦附近的高能物理研究中心,在1991年发布了Web以来,Web技术已经从静态的内容和Common Gateway Interface(CG