`
Jabbar2011
  • 浏览: 165110 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jndi与jdbc的知识收藏

阅读更多
来公司快一年了,一直没怎么真正接触后台数据库的内容,今天抽了一点时间瞄了一下

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一

要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。

没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:

Connection conn=null;
try {
  Class.forName("com.mysql.jdbc.Driver",
                true, Thread.currentThread().getContextClassLoader());
  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
  /* 使用conn并进行SQL操作 */
  ......
  conn.close();
}
catch(Exception e) {
  e.printStackTrace();
}
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) {}
  }
}


这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。

没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
4、......

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

由此,就有了JNDI。

用了JNDI之后的做法:
首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
具体操作如下(以JBoss为例):
1、配置数据源
在 JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。
修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>rootpassword</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
</local-tx-datasource>
</datasources>

这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。

2、在程序中引用数据源:

Connection conn=null;
try {
  Context ctx=new InitialContext();
  Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源
  DataSource ds=(Datasource)datasourceRef;
  conn=ds.getConnection();
  /* 使用conn进行数据库SQL操作 */
  ......
  c.close();
}
catch(Exception e) {
  e.printStackTrace();
}
finally {
  if(conn!=null) {
    try {
      conn.close();
    } catch(SQLException e) { }
  }
}

直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。
在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。
-----------------------------------------
在tomcat下context.xml中配置各种数据库连接池 

Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml 和 context.xml。当然,还有其他一些资源文件。但是在在本文中我们只用得上这两个,其他的就不介绍了。

1.   首先,需要为数据源配置一个JNDI资源。 我们的数据源JNDI资源应该定义在context元素中。 在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个context.xml文件中。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。 我们当然推荐把应用需要的JNDI资源配置在context.xml文件中,而不是server.xml文件中。

1、首先,将数据库的驱动程序copy到tomcat6.0\lib下,这一部是关键,如果没有copy 当运行程序的时候后报-找不到驱动-的异常。

2、将下面的代码放到Tomcat 6.0\conf\context.xml中间,如:

<Context reloadable="true">

<Resource

name="jdbc/数据库名"

type="javax.sql.DataSource"

maxActive="100"

maxIdle="30"

maxWait="5000"

username="用户名"

password="密码"

driverClassName="数据库的驱动"

url="数据库的连接地址" />

</Context>

解释:(100 30 5000 为上面的数据)

maxActive="最大可以有100名用户连接数据源"

maxIdle="如果没有用户连接,空出30个连接等待用户连接"

maxWait="如果已连接用户5000秒内没有再次连接数据源,则放弃此连接"

完成这两部,数据源就可以用了。



另外,也可以在项目root下的WEB-INF下新建context.xml进行配置

<?xml version="1.0" encoding="UTF-8"?>

<Context>/////直连

<Resource

name="jdbc/book"

type="javax.sql.DataSource"

password=""

driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"

maxIdle="5"

maxWait="5000"

username="sa"

url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=book"////直连数据源

maxActive="10"/>

</Context>

<!-->

<Context>////桥连

<Resource

name="jdbc/book"

type="javax.sql.DataSource"

password=""

driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"

maxIdle="2"

maxWait="5000"

username="sa"

url="jdbc:odbc:bb"///桥连的数据源

maxActive="4"/>

<WatchedResource>C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\context.xml</WatchedResource>

</Context>

<!-->



直接在Context文件中加入入:

<Resource

name="jdb/dbsource"

type="javax.sql.DataSource"

driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"

maxIdle="2"

maxWait="5000"

url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=jspdev"

maxActive="4"/>

username="he"

password="he"



通过java的jndi就可以了

InitialContext initCtx = new InitialContext();
       DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/数据库名");
       Connection conn = ds.getConnection();

原文地址http://blog.163.com/samoyed_kk/blog/static/853760092008525462373/,http://blog.csdn.net/zhaosg198312/article/details/3979435
分享到:
评论

相关推荐

    ssm+maven+jndi+jdbc

    在这个项目中,结合了Maven进行依赖管理,并且使用了JNDI(Java Naming and Directory Interface)和JDBC(Java Database Connectivity)来处理数据库连接。 Spring框架是这个项目的核心,版本为5.0.4。Spring 5.0...

    JDBC (c3p0、dbcp、jndi及不使用连接池)代码

    Java Database Connectivity(JDBC)是Java编程语言与各种数据库交互的标准接口。JDBC允许开发者用Java编写数据库应用程序,无论数据库管理系统(DBMS)是何种类型。本篇将详细讲解使用JDBC进行数据库操作的不同方法,...

    在Weblogic9.2里添加JDBC连接,并用JNDI名称进行调用

    - 确保JDBC驱动与数据库版本兼容。 - 配置数据源时,避免使用硬编码的数据库连接信息,以提高应用的可移植性和安全性。 - 根据应用需求调整连接池参数,防止资源耗尽。 - 关注数据源的监控和日志,以便于故障...

    Java通用Dao包括JDBC和JNDI两种连接方式

    在Java中,实现通用DAO通常涉及到JDBC(Java Database Connectivity)和JNDI(Java Naming and Directory Interface)两种不同的数据库连接方式。 首先,让我们来详细了解一下JDBC。JDBC是Java中用于与关系型数据库...

    JDBC,JNDI和servlet小例子

    在IT行业中,JDBC(Java Database Connectivity)、JNDI(Java Naming and Directory Interface)和Servlet是Java Web开发中的三大核心技术,它们各自承担着不同的职责,共同构建了强大的Web应用程序。 首先,JDBC...

    在线购物程序代码及数据库文件(JDBC连接池+Struts)

    下面将详细阐述这两个关键知识点。 1. **Struts框架** - **简介**:Struts是Apache软件基金会下的一个开源项目,它提供了构建基于Java Servlets的Web应用程序的MVC框架。Struts通过定义Action类、配置文件以及一...

    jdbc连接数据库(jndi连接池)

    综合上述知识点,这个项目可能包含了一个Java程序,它使用反射和简单工厂模式来实现对三种不同数据库的JDBC操作,并且通过JNDI查找连接池来管理数据库连接。同时,XML可能用于配置数据库的相关信息,如连接参数,...

    Tomcat中JNDI原理

    当`myApp`启动时,Tomcat会自动创建与`myApp`对应的ClassLoader,并通过`ContextBindings`将`jdbc/myDataSource`与该ClassLoader绑定。然后,在应用中,可以使用以下代码来获取数据源: ```java Context initCtx = ...

    tomcat6中配置JNDI方法

    #### 二、JNDI与JDBC对比 JNDI作为JDBC的一种补充,主要优势在于: 1. **资源管理**:JNDI可以统一管理和查找应用程序中的各种资源,包括数据源。 2. **灵活性**:通过JNDI,开发者可以在不修改代码的情况下更改...

    用jndi操作数据库小实例

    在Java EE环境中,JNDI通常与应用服务器集成,允许应用通过名字查找预配置的资源,如数据源。 数据源(DataSource)是JDBC的一个接口,它负责管理数据库连接。使用数据源的好处包括连接池管理、事务支持和自动关闭...

    Tongweb5中配置JDBC连接池

    本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些数据源。 首先,我们需要了解JDBC连接池的基本原理。JDBC连接池是在应用启动时预...

    jndi-1_2_1.zip_jndi_jndi-1.2.1.jar

    JNDI的核心理念是将应用程序与特定的命名或目录服务解耦,使得开发者能够灵活地在不同环境中部署应用,无需更改代码。 标题中的"jndi-1_2_1.zip_jndi_jndi-1.2.1.jar"表明这是一个关于JNDI的版本1.2.1的开源软件包...

    JNDIDemo 以及相关文档

    8. **JNDI与EJB和JDBC**:在Enterprise JavaBeans (EJB) 中,JNDI用于查找和注入EJB实例。在Java Database Connectivity (JDBC) 中,数据源通常通过JNDI查找来获取,这样可以轻松地在不同环境中配置数据库连接。 9....

    tomcat jndi 的困惑

    tomcat jndi 的困惑 Cannot create JDBC driver of class '' for connect URL 'null'

    JNDI学习文档.doc

    **Java Naming and Directory Interface...以上就是JNDI的基本知识和应用场景,通过理解和使用JNDI,开发者可以构建更加灵活、可扩展和易于管理的Java应用。在实际项目中,JNDI常常是Java EE开发者不可或缺的一个工具。

    jndi-tool JNDI服务利用工具

    总结来说,"jndi-tool"是一个强大的JNDI服务利用工具,适用于评估和利用与Fastjson和Log4j漏洞相关的RCE风险。它利用RMI和LDAP协议,可以在高版本JDK环境下运行,为安全专业人士提供了一种有效测试环境安全性的手段...

    配置 JNDI 数据源

    下面将详细解释配置JNDI数据源的相关知识点。 一、JNDI数据源的概念 JNDI数据源是一种在JNDI上下文中注册的数据库连接池对象,它提供了一种在多个应用之间共享数据库连接的方法。这样,每个应用都可以通过JNDI查找...

Global site tag (gtag.js) - Google Analytics