当我们使用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"是针对EJB+JPA在JBoss应用服务器中的配置文件,它们各自承担着不同的职责。 首先,"jboss-web.xml"是JBoss特定的Web应用程序部署描述符,它是...
在Java Web开发中,JNDI(Java Naming and Directory Interface)是一个重要的标准接口,它允许应用程序查找和使用各种资源,包括数据源(Datasource)。数据源是管理数据库连接的组件,能够有效地处理数据库连接的...
通过以上步骤,开发者可以在IntelliJ IDEA中使用Tomcat自动部署JNDI数据源,实现高效、灵活的数据库连接管理。这对于大型企业级应用来说尤其重要,因为它简化了数据库连接的配置和管理,使得团队协作变得更加顺畅。
4. **在Eclipse中配置项目**: 将你的Web项目导入Eclipse,然后在项目的`src/main/webapp/META-INF`目录下创建或更新`context.xml`文件,内容与上一步相同。确保Eclipse的Tomcat服务器已添加到Servers视图,并且...
JNDI 数据源的配置完成后,我们就可以在 WebLogic 中使用该数据源来连接数据库了。通过 JNDI 数据源,我们可以实现在 WebLogic 中对数据库的访问和管理。 JNDI 数据源的优点: * 提高了应用程序的可移植性和灵活...
在Java应用服务器中,JNDI通常用于查找数据源,这些数据源已经预先配置好,可以直接供应用程序使用,从而降低配置复杂性。 接下来,我们将详细讲解在Spring中配置JNDI数据源的步骤: 1. **配置数据源在应用服务器...
在Java应用程序中,JNDI主要用来查找和绑定资源,例如数据库连接池、邮件服务器配置等。通过JNDI,开发者可以将应用程序的配置信息与代码分离,使得配置的修改变得更加灵活和方便。 ### JNDI的基本概念 1. **...
在Spring框架与Tomcat服务器的集成中,配置JNDI数据源是将数据库连接管理交给服务器来处理,提高应用的可移植性和资源利用率。下面将详细解释配置JNDI数据源的相关知识点。 一、JNDI数据源的概念 JNDI数据源是一种...
综上所述,这个文档主要讲述了如何在Tomcat服务器上,通过Hibernate和JNDI数据源配置,使用DBCP连接池连接MySQL数据库。尽管Hibernate官方并不推荐使用DBCP,但文档仍然提供了详细的配置步骤,包括环境准备、数据库...
【内容】:配置JNDI数据源在Java Web应用程序中是一个重要的任务,它允许应用与数据库之间的连接管理更加高效和集中。在Tomcat服务器上,JNDI(Java Naming and Directory Interface)数据源提供了一种标准的方式来...
然而,有时我们可能希望在非Web环境下或不使用JNDI的情况下配置数据源,这时我们需要在Spring的配置文件中等价地实现JNDI的数据源配置。以下是如何在Spring中进行这种转换的详细步骤和知识点: 1. **理解JNDI配置**...
在Tomcat6.0中配置JNDI,主要是为了实现应用中的数据源管理,使得多个应用可以共享一个数据库连接池,提高资源利用率和系统性能。 **一、JNDI的基本概念** JNDI提供了一个统一的接口,让开发者可以查找和绑定各种...
在给定的描述中提到的"博文链接"可能详细阐述了如何在实际项目中使用JNDI进行操作。 在Java EE环境中,数据源通常被配置在服务器的配置文件中,如`web.xml`或特定服务器的配置(例如Tomcat的`context.xml`)。数据...
- 在应用项目的`WEB-INF/web.xml`文件中添加对数据源的引用。 ```xml <description>MySQL DataSource <res-ref-name>jdbc/TestDB <res-type>javax.sql.DataSource <res-auth>Container ``` - 这里`...
在 Jboss 项目部署时,需要配置 JNDI,以便 Jboss 服务器可以正确地查找项目的资源。 七、项目配置文件修改 在部署 Jboss 项目时,需要修改项目的配置文件,以便 Jboss 服务器可以正确地运行项目。例如,需要修改 ...
在IT行业中,应用服务器(Application Server)是用于部署和运行企业级Java应用程序的软件平台,如Web服务、EJB(Enterprise JavaBeans)等。JNDI(Java Naming and Directory Interface)是Java平台的一个核心API,...
Tomcat 是一个流行的 Java Web 服务器,JNDI(Java Naming and Directory Interface)是 Java 中的一种命名和目录接口规范。Tomcat 中的 JNDI 数据源是指将数据库连接信息注册到 JNDI 服务器中,以便在应用程序中...
jboss 配置jndi数据源,deploy下配置oracle-ds.xml
4. **Web应用上下文配置**:如果你的应用是在特定的Web应用上下文中使用JNDI,那么需要在该应用的`WEB-INF/web.xml`中进行额外的上下文初始化参数配置。 5. **权限问题**:配置的JNDI资源需要适当的权限才能被应用...