`
lee372106501
  • 浏览: 7060 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用web服务器配置jndi时如何在项目中取出原生的OracleConnection

    博客分类:
  • jndi
 
阅读更多
当我们使用web服务器配置JNDI,而在项目中使用dataSource.getConnection()时取出的链接往往是经过web容器包装后的Connection,如Websphere包装后的连接是com.ibm.ws.rsadapter.jdbc.WSJdbcConnection,但在应用中有时需要使用原生的OracleConnection(包括其子类)来进行特定的操作,比如使用Oracle AQ时就必须要用OracleConnection。本文将简单的介绍如何对取出的连接进行转换获取需要的连接,以及在tomcat下如何配置,让取出的Connection就是OracleConnection家的。

1.对取出的连接进行转换获取需要的连接
当然你可以自己编写代码,不过这件事spring已经帮忙解决了,spring提供的NativeJdbcExtractor可以很出色的完成这个任务,针对不同的web服务器有不同的实现类:

下面一段简单的代码是依靠NativeJdbcExtractor为Oracle AQ获取原生的OracleConnection
package com.lc.oracle.aq;

import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.sql.DataSource;

import oracle.jdbc.OracleConnection;
import oracle.jms.AQjmsQueueConnectionFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor;


public class OracleAQConnectionFactory implements ConnectionFactory {
    
	protected static final Logger logger = LoggerFactory.getLogger(OracleAQConnectionFactory.class);
	
	private DataSource dataSource;
    
    private NativeJdbcExtractor nativeJdbcExtractor;
    
	public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }    

	public void setNativeJdbcExtractor(NativeJdbcExtractor nativeJdbcExtractor) {
		this.nativeJdbcExtractor = nativeJdbcExtractor;
	}

	@Override
    public javax.jms.Connection createConnection() throws JMSException {
		java.sql.Connection con = DataSourceUtils.getConnection(this.dataSource);
        java.sql.Connection conToUse = con;
		if (!(con instanceof OracleConnection)) {
			if (logger.isDebugEnabled()) {
				logger.debug("Unwrapping JDBC Connection of type:" + con.getClass().getName());
			}
			try {
				conToUse = (OracleConnection) this.nativeJdbcExtractor.getNativeConnection(con);
				if (logger.isDebugEnabled()) {
					logger.debug("Using Native JDBC Connection [" + conToUse + "]");
				}
			} catch (Exception e) {
				throw new RuntimeException("Error unwrapping the Oracle Connection: " + e.getMessage(), e);
			}
		}
		return AQjmsQueueConnectionFactory.createQueueConnection(conToUse);
    }

    @Override
    public javax.jms.Connection createConnection(String username, String password) throws JMSException {
        throw new UnsupportedOperationException("creating connection with explicit username/password not supported");
    }
}

当然如果你的项目中使用了Oracle AQ,完全不需要这么做,你可以使用以下代码:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/test" proxy-interface="javax.sql.DataSource" />

<!-- Oracle Advanced Queue Connection Factory -->
	<orcl:aq-jms-connection-factory id="connectionFactory" connection-factory-type="QUEUE_CONNECTION"
		data-source="dataSource" native-jdbc-extractor="webSphereNativeJdbcExtractor"
		use-local-data-source-transaction="true" />
	
	<!-- Jdbc Extractor -->
	<bean id="webSphereNativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor" />

既然是这样,那么我给出上面那段简单代码是什么用意呢?也许你已经发现上面那段代码第34行在获取连接时并没有使用dataSource.getConnection(),而使用的是DataSourceUtils.getConnection(this.dataSource),这么做的目的是为了防止连接泄漏,这篇文章里有很好的讲解http://www.ibm.com/developerworks/cn/java/j-lo-spring-ts3/,我在这里点出来是为了大家更好的学习。

2.在tomcat下如何配置,让取出的Connection就是OracleConnection?
我们一般在tomcat下配置jndi会使用下面的方式:
<Resource name="jdbc/test"
            auth="Container"
            type="javax.sql.DataSource"
            username="dbusername"
            password="dbpassword"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@ip:1521:orcl"
            maxActive="100"
            maxIdle="10"
            maxWait="10000"/>

这样配置在使用时不经转换就会报错:

(图中的oracle.jdbc.internal.OracleConnection extends oracle.jdbc.OracleConnection)

如果要让取出的连接不经转换就是Oracle的Connection,需要把type和driverClassName改成oracle.jdbc.pool.OracleDataSource,factory默认是org.apache.commons.dbcp.BasicDataSourceFactory,改成oracle.jdbc.pool.OracleDataSourceFactory,这时你再测试就会报错:用户名或密码错误,这个问题很奇怪,需要把上面的username改成user,至于为什么,没有找到相关的文档说明。
修改之后的配置如下:
<Resource name="jdbc/test"
            auth="Container"
            type="oracle.jdbc.pool.OracleDataSource"
            factory="oracle.jdbc.pool.OracleDataSourceFactory"
            user="dbusername"
            password="dbpassword"
            driverClassName="oracle.jdbc.pool.OracleDataSource"
            url="jdbc:oracle:thin:@ip:1521:orcl"
            maxActive="100"
            maxIdle="10"
            maxWait="10000"/>




  • 大小: 126.4 KB
  • 大小: 289.6 KB
分享到:
评论

相关推荐

    jboss-web.xml jndi.properties oracle-ds.xml

    在本案例中,"jboss-web.xml"、"jndi.properties"和"oracle-ds.xml"是针对EJB+JPA在JBoss应用服务器中的配置文件,它们各自承担着不同的职责。 首先,"jboss-web.xml"是JBoss特定的Web应用程序部署描述符,它是...

    JNDI配置数据源在java web开发中的使用

    在Java Web开发中,JNDI(Java Naming and Directory Interface)是一个重要的标准接口,它允许应用程序查找和使用各种资源,包括数据源(Datasource)。数据源是管理数据库连接的组件,能够有效地处理数据库连接的...

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

    通过以上步骤,开发者可以在IntelliJ IDEA中使用Tomcat自动部署JNDI数据源,实现高效、灵活的数据库连接管理。这对于大型企业级应用来说尤其重要,因为它简化了数据库连接的配置和管理,使得团队协作变得更加顺畅。

    eclipse+mysql+tomcat配置JNDI

    4. **在Eclipse中配置项目**: 将你的Web项目导入Eclipse,然后在项目的`src/main/webapp/META-INF`目录下创建或更新`context.xml`文件,内容与上一步相同。确保Eclipse的Tomcat服务器已添加到Servers视图,并且...

    weblogic下配置JNDI数据源

    JNDI 数据源的配置完成后,我们就可以在 WebLogic 中使用该数据源来连接数据库了。通过 JNDI 数据源,我们可以实现在 WebLogic 中对数据库的访问和管理。 JNDI 数据源的优点: * 提高了应用程序的可移植性和灵活...

    spring 配置jndi

    在Java应用服务器中,JNDI通常用于查找数据源,这些数据源已经预先配置好,可以直接供应用程序使用,从而降低配置复杂性。 接下来,我们将详细讲解在Spring中配置JNDI数据源的步骤: 1. **配置数据源在应用服务器...

    jndi配置

    在Java应用程序中,JNDI主要用来查找和绑定资源,例如数据库连接池、邮件服务器配置等。通过JNDI,开发者可以将应用程序的配置信息与代码分离,使得配置的修改变得更加灵活和方便。 ### JNDI的基本概念 1. **...

    配置 JNDI 数据源

    在Spring框架与Tomcat服务器的集成中,配置JNDI数据源是将数据库连接管理交给服务器来处理,提高应用的可移植性和资源利用率。下面将详细解释配置JNDI数据源的相关知识点。 一、JNDI数据源的概念 JNDI数据源是一种...

    用dbcp连接池,mysql数据库,在tomcat服务器下,通过hibernate配置jndi数据源.doc

    综上所述,这个文档主要讲述了如何在Tomcat服务器上,通过Hibernate和JNDI数据源配置,使用DBCP连接池连接MySQL数据库。尽管Hibernate官方并不推荐使用DBCP,但文档仍然提供了详细的配置步骤,包括环境准备、数据库...

    tomcat配置JNDI数据源

    【内容】:配置JNDI数据源在Java Web应用程序中是一个重要的任务,它允许应用与数据库之间的连接管理更加高效和集中。在Tomcat服务器上,JNDI(Java Naming and Directory Interface)数据源提供了一种标准的方式来...

    如何在spring中等价配置得到原本由jndi配置实现的数据源

    然而,有时我们可能希望在非Web环境下或不使用JNDI的情况下配置数据源,这时我们需要在Spring的配置文件中等价地实现JNDI的数据源配置。以下是如何在Spring中进行这种转换的详细步骤和知识点: 1. **理解JNDI配置**...

    tomcat6.0 配置jndi

    在Tomcat6.0中配置JNDI,主要是为了实现应用中的数据源管理,使得多个应用可以共享一个数据库连接池,提高资源利用率和系统性能。 **一、JNDI的基本概念** JNDI提供了一个统一的接口,让开发者可以查找和绑定各种...

    java jndi的使用

    在给定的描述中提到的"博文链接"可能详细阐述了如何在实际项目中使用JNDI进行操作。 在Java EE环境中,数据源通常被配置在服务器的配置文件中,如`web.xml`或特定服务器的配置(例如Tomcat的`context.xml`)。数据...

    tomcat6中配置JNDI方法

    - 在应用项目的`WEB-INF/web.xml`文件中添加对数据源的引用。 ```xml &lt;description&gt;MySQL DataSource &lt;res-ref-name&gt;jdbc/TestDB &lt;res-type&gt;javax.sql.DataSource &lt;res-auth&gt;Container ``` - 这里`...

    Jboss项目部署文档

    在 Jboss 项目部署时,需要配置 JNDI,以便 Jboss 服务器可以正确地查找项目的资源。 七、项目配置文件修改 在部署 Jboss 项目时,需要修改项目的配置文件,以便 Jboss 服务器可以正确地运行项目。例如,需要修改 ...

    应用服务器JNDI自动配置工具

    在IT行业中,应用服务器(Application Server)是用于部署和运行企业级Java应用程序的软件平台,如Web服务、EJB(Enterprise JavaBeans)等。JNDI(Java Naming and Directory Interface)是Java平台的一个核心API,...

    tomcat配置jndi数据源

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

    jboss 配置jndi数据源

    jboss 配置jndi数据源,deploy下配置oracle-ds.xml

    Tomcat6配置JNDI出错

    4. **Web应用上下文配置**:如果你的应用是在特定的Web应用上下文中使用JNDI,那么需要在该应用的`WEB-INF/web.xml`中进行额外的上下文初始化参数配置。 5. **权限问题**:配置的JNDI资源需要适当的权限才能被应用...

Global site tag (gtag.js) - Google Analytics