`
ootabc
  • 浏览: 110793 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Tomcat jndi配置精华版

    博客分类:
  • java
阅读更多
1.在Tomcat中添加JNDI数据源
建议用Tomcat的Adiminstration添加。在默认情况下,Tomcat没有安装administration组件,详细安装步骤请参考《Install the component Admin for tomcat》。
登陆http://localhost:8080/admin, 进入Resources -> Data Sources -> Create New Data Source
设置JNDI参数:(这里以MySql为例)
JNDI Name:jdbc/mysql(JNDI 名随便起)
Data Source URL:jdbc:mysql://localhost:3306/test(这里test是数据库名,当然后面还可以带其他参数,如:jdbc: mysql://localhost:3306/test?user=root&password=&useUnicode=true& characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false)
JDBC Driver Class:com.mysql.jdbc.Driver (要把相应的驱动jar包放到$TOMCAT_HOME$/common/lib)
User Name:root    (用户名)
Password:*****    (密码)
Max. Active Connections:4   
Max. Idle Connections:2
Max. Wait for Connection:5000

2.在Web项目中配置resouce-ref
在项目的web.xml的根节点下添加以下内容:
    <resource-ref>
        <res-ref-name>jdbc/mysql</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>


注意:这里res-ref-name必须与在tomcat中设置的JNDI Name:jdbc/mysql(JNDI 名随便起)一致。

3.设置$TOMCAT_HOME$/conf/server.xml
因为TOMCAT不会自动将Data Source Resource信息加到Context中,所以经常会忽略这一步
当前server.xml的内容为:
<?xml version="1.0" encoding="UTF-8"?>
<Server>
<Listener className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
<GlobalNamingResources>
    <Environment
      name="simpleValue"
      type="java.lang.Integer"
      value="30"/>
    <Resource
      auth="Container"
      description="User database that can be updated and saved"
      name="UserDatabase"
      type="org.apache.catalina.UserDatabase"
      pathname="conf/tomcat-users.xml"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"/>
    <Resource
      name="jdbc/mysql"
      type="javax.sql.DataSource"
      password="123456"
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      username="root"
      url="jdbc:mysql://localhost:3306/test"
      maxActive="4"/>
</GlobalNamingResources>
<Service
      name="Catalina">
    <Connector
        port="8080"
        redirectPort="8443"
        minSpareThreads="25"
        connectionTimeout="60000"
        connectionLinger="-1"
        serverSoTimeout="0"
        maxSpareThreads="75"
        maxThreads="150"
        tcpNoDelay="true"
        maxHttpHeaderSize="8192">
    </Connector>
    <Connector
        port="8009"
        redirectPort="8443"
        protocol="AJP/1.3">
    </Connector>
    <Engine
        defaultHost="localhost"
        name="Catalina">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
      <Host
          appBase="webapps"
          name="localhost">
        <Context
            docBase="/test"
            path="/test"
            reloadable="true"
            debug="5" 
            crossContext="true">
          <Resource
                  name="jdbc/mysql"
                  type="javax.sql.DataSource"
                  password="123456"
                  maxIdle="2"
                  maxWait="5000"
                  username="root"
                  maxActive="4"
                  />
        </Context>
      </Host>
    </Engine>
</Service>
</Server>

如果不更改该server.xml文件,使用jdbc/mysql时抛exception Cannot create JDBC driver of class '' for connect URL 'null'。
留意代码最后的resource
         
  <Context
            docBase="/test"
            path="/test"
            reloadable="true"
            debug="5" 
            crossContext="true">
          <Resource
                  name="jdbc/mysql"
                  type="javax.sql.DataSource"
                  password="123456"
                  maxIdle="2"
                  maxWait="5000"
                  username="root"
                  maxActive="4"
                  />
        </Context>

发现在<Resource />标签中没包含属性driverClassName和url,这是抛Exception Cannot create JDBC driver of class '' for connect URL 'null'的原因。
我们只需要将<GlobalNamingResources></GlobalNamingResources>中相应的Resource
        <Resource
      name="jdbc/mysql"
      type="javax.sql.DataSource"
      password="123456"
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      username="root"
      url="jdbc:mysql://localhost:3306/test"
      maxActive="4"/>

     
替换掉Context下的resource即可。

更改后的server.xml文件内容为:
<?xml version="1.0" encoding="UTF-8"?>
<Server>
<Listener className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
<GlobalNamingResources>
    <Environment
      name="simpleValue"
      type="java.lang.Integer"
      value="30"/>
    <Resource
      auth="Container"
      description="User database that can be updated and saved"
      name="UserDatabase"
      type="org.apache.catalina.UserDatabase"
      pathname="conf/tomcat-users.xml"
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"/>
    <Resource
      name="jdbc/mysql"
      type="javax.sql.DataSource"
      password="123456"
      driverClassName="com.mysql.jdbc.Driver"
      maxIdle="2"
      maxWait="5000"
      username="root"
      url="jdbc:mysql://localhost:3306/test"
      maxActive="4"/>
</GlobalNamingResources>
<Service
      name="Catalina">
    <Connector
        port="8080"
        redirectPort="8443"
        minSpareThreads="25"
        connectionTimeout="60000"
        connectionLinger="-1"
        serverSoTimeout="0"
        maxSpareThreads="75"
        maxThreads="150"
        tcpNoDelay="true"
        maxHttpHeaderSize="8192">
    </Connector>
    <Connector
        port="8009"
        redirectPort="8443"
        protocol="AJP/1.3">
    </Connector>
    <Engine
        defaultHost="localhost"
        name="Catalina">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
      <Host
          appBase="webapps"
          name="localhost">
        <Context
            docBase="/test"
            path="/test"
            reloadable="true"
            debug="5" 
            crossContext="true">
          <Resource
                  name="jdbc/mysql"
                  type="javax.sql.DataSource"
                  password="123456"
                  driverClassName="com.mysql.jdbc.Driver"
                  maxIdle="2"
                  maxWait="5000"
                  username="root"
                  url="jdbc:mysql://localhost:3306/test"
                  maxActive="4"/>
        </Context>
      </Host>
    </Engine>
</Service>
</Server>


4.在java代码中使用JNDI资源获得DataSource

    
   javax.naming.InitialContext ctx = new javax.naming.InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
        Connection conn = ds.getConnection();

       
该代码在JDK1.5下测试通过

在一些资料中提到,在JDK1.5以前的版本可以通过
DataSource ds = (DataSource) ctx.lookup("jdbc/mysql");
获得DataSource。

我没测试过该代码。


上述代码在J2EE服务器环境下工作得很好,但是在main()中就会报一个NoInitialContextException。

之所以有NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中。
所以可以通过以下方法解决:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext ctx = new InitialContext(env);


System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:3306/test");
System.setProperty(Context.SECURITY_PRINCIPAL, "root");
System.setProperty(Context.SECURITY_CREDENTIALS, "123456");

以上代码建议改为在配置文件中配置
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=rmi://localhost:3306/test
java.naming.security.principal=user
java.naming.security.credentials=password


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1851149
分享到:
评论

相关推荐

    Tomcat JNDI配置

    Tomcat JNDI 配置 Tomcat JNDI 配置是 Java Web 应用程序中的一种常见配置,用于将数据库连接信息以 JNDI(Java Naming and Directory Interface)的形式存储在 Tomcat 服务器中,以便于应用程序可以通过 JNDI 来...

    TOMCAT JNDI配置

    ### TOMCAT JNDI配置详解 #### 一、概述 TOMCAT服务器是Apache软件基金会下的Jakarta项目中的一个开源Web应用容器。JNDI(Java Naming and Directory Interface)是Java平台提供的一种标准接口,用于访问命名和目录...

    Tomcat中JNDI原理

    在部署该应用时,管理员可以在Tomcat的配置文件中设置相应的JNDI条目: ```xml type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb" username=...

    Tomcat jndi 配置数据源过程

    JNDI配置数据源是将数据库连接池集成到Tomcat中的重要步骤,这样可以提高应用的性能和可维护性。下面我们将详细介绍如何在Tomcat中通过JNDI配置数据源。 首先,我们需要了解数据源是什么。数据源是一个对象,它管理...

    tomcat jndi 数据库配置方法

    tomcat jndi 数据库配置方法

    tomcat-jndi

    总结来说,Tomcat的JNDI功能提供了强大的资源管理和配置灵活性,通过解耦配置和代码,提高了系统的可扩展性和可维护性。理解并熟练运用Tomcat的JNDI机制,对于开发高质量、高可用性的Java Web应用至关重要。而`...

    tomcat6.0 配置jndi

    【标题】:“Tomcat6.0配置JNDI” 在Java Web开发中,Tomcat作为常用的Servlet容器,经常被用于部署和运行Java EE应用程序。JNDI(Java Naming and Directory Interface)是Java平台的一项服务,它允许应用程序通过...

    tomcat jndi数据源解密factory

    自定义jndi数据源factory类,用于解密jndi中的加密数据,解密方式为DES,具体可根据实际需求修改。

    tomcat配置JNDI数据源

    【标题】:“Tomcat配置JNDI数据源” 【描述】:“在Tomcat服务器上配置JNDI数据源,特别是通过DBCP连接池的方式” 【标签】:“tomcat,配置,JNDI数据源” 【内容】:配置JNDI数据源在Java Web应用程序中是一个...

    Tomcat JNDI 数据源 自动生成程序 Servlet 版

    Tomcat JNDI 数据源 自动生成程序 Servlet 版 本程序自动判断Tomcat版本,兼容tomcat 5.0、5.5、6.0等版本, 根据项目名自动生成 JNDI 配置文件,使程序员从手动配置JNDI数据源中解脱出来。 使用说明: 1、把...

    intellij idea使用tomcat开发时自动部署jndi数据源

    在这个场景中,“intellij idea使用tomcat开发时自动部署jndi数据源”是一个重要的知识点,它涉及到如何在IDE中配置和管理数据库连接,以便于在应用运行时动态地查找和使用数据源。 JNDI(Java Naming and ...

    tomcat配置jndi数据源

    Tomcat 配置 JNDI 数据源 Tomcat 是一个流行的 Java Web 服务器,JNDI(Java Naming and Directory Interface)是 Java 中的一种命名和目录接口规范。Tomcat 中的 JNDI 数据源是指将数据库连接信息注册到 JNDI ...

    tomcat8 JNDI数据源加密

    TOMCAT8 JNDI对用户名和密码加密

    Tomcat6配置JNDI出错

    在本文中,我们将深入探讨“Tomcat6配置JNDI出错”这一主题,这是一个常见的问题,很多开发者在搭建和配置Java企业级应用时可能会遇到。 JNDI,全称Java Naming and Directory Interface,是Java平台的一个标准接口...

    tomcat配置jndi

    **Tomcat配置JNDI详解** Java Naming and Directory Interface (JNDI) 是Java平台提供的一种标准服务,用于管理和查找应用程序中的资源,如数据源、邮件服务器等。在Tomcat应用服务器中,JNDI被用来注册和查找数据...

    eclipse+mysql+tomcat配置JNDI

    在Tomcat中,JNDI常用于配置数据库连接池,使得多个Web应用可以共享同一个数据库连接。 配置JNDI的步骤如下: 1. **安装与配置MySQL**: 首先确保你已经安装了MySQL数据库,并创建了所需的数据库和用户。你需要...

    Tomcat配置JNDI数据源的N种方法

    Tomcat配置JNDI数据源的N种方法

    Tomcat6+spring+jndi配置数据源说明.docx

    Tomcat6+Spring+JNDI配置数据源说明 本文档主要介绍了Tomcat6+Spring+JNDI配置数据源的详细步骤和原理。数据源是一个池子,里面有若干个数据连接对象,当需要时就从里面拿一个使用,使用完毕就放回去,如果超过最大...

    在Tomcat配置JNDI数据源的三种方式

    在Tomcat配置JNDI数据源的三种方式

    hibernate 3.1+tomcat 5.5.x(配置jndi)

    ### hibernate 3.1+tomcat 5.5.x(配置jndi) #### 一、引言 随着Tomcat从5.0版本升级到5.5.x版本,其配置发生了诸多变化,特别是对Tomcat JNDI的配置方式产生了显著的影响。这对希望在Hibernate安装中利用Tomcat ...

Global site tag (gtag.js) - Google Analytics