【问题标题】:Oracle JNDI Tomcat and SpringOracle JNDI Tomcat 和 Spring
【发布时间】:2012-05-28 07:48:38
【问题描述】:

我正在尝试在 Tomcat 中配置 Oracle JNDI 数据源以与我的 Spring 数据源一起使用,但每次尝试连接到我的数据库时都会遇到问题。

这是我的配置:

在我的应用程序 /META-INF/context.xml

<Context docBase="web-site" path="/web-site" reloadable="true" source="org.eclipse.jst.j2ee.server:web-site">

    <Resource name="jdbc/OracleDB" auth="Container"
    type="oracle.jdbc.pool.OracleDataSource" username="system" password="xxxxx"
    driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@127.0.0.1:1521:XE"
    factory="oracle.jdbc.pool.OracleDataSourceFactory" maxactive="40"
    maxidle="3" maxwait="10000" poolpreparedstatements="true"
    maxopenpreparedstatements="100" validationquery="SELECT SYSDATE FROM DUAL" />

</Context>

在WEB-INF/web.xml中:

<resource-ref>
    <description>Oracle Connection Pool</description>
    <res-ref-name>jdbc/OracleDB</res-ref-name>
    <res-type>oracle.jdbc.pool.OracleDataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在spring-dao-config.xml中:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/OracleDB" />
    <property name="resourceRef" value="true"/>
    <property name="proxyInterface" value="javax.sql.DataSource" />
    <property name="lookupOnStartup" value="true" />
</bean>

当我尝试运行我的应用程序时,出现以下错误页面:

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
cause mère

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Could not open connection
    org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:440)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy18.readAll(Unknown Source)
    com.website.controller.HelloWorldController.helloWord(HelloWorldController.java:20)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:616)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
cause mère

org.hibernate.exception.GenericJDBCException: Could not open connection
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:52)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:304)
    org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
    org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
    org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
    org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1263)
    org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:399)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy18.readAll(Unknown Source)
    com.website.controller.HelloWorldController.helloWord(HelloWorldController.java:20)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:616)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
cause mère

java.sql.SQLException: arguments non valides dans l'appel
    oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
    oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
    oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209)
    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:236)
    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:454)
    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:802)
    oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:298)
    oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:222)
    oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:166)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:616)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    $Proxy6.getConnection(Unknown Source)
    org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141)
    org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:276)
    org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297)
    org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
    org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
    org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
    org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1263)
    org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:399)
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    $Proxy18.readAll(Unknown Source)
    com.website.controller.HelloWorldController.helloWord(HelloWorldController.java:20)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:616)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

请问您对我的问题有任何想法吗? 谢谢

【问题讨论】:

  • 您应该从 META-INF/context.xml 文件中删除“path”和“docBase”属性。也许那些是由 NetBeans 放入的,但它们不应该在那里。
  • 是的,我删除了属性,但什么也没发生,同样的行为

标签: oracle spring tomcat jndi


【解决方案1】:

最初的异常是“java.sql.SQLException: arguments non valides dans l'appel”(英文:“java.sql.SQLException: invalid arguments in call”)并且发生在驱动程序级别。我不认为这是 Tomcat 中的问题。

我会检查您的 Oracle JDBC URL ("jdbc:oracle:thin:@127.0.0.1:1521:XE") 以确保它是准确的,适合您正在使用的驱动程序(您是否使用瘦驱动程序?大多数人都这样做,但值得检查),并且格式正确。

如果您仍然遇到问题,请考虑使用 Tomcat 的内置 DataSource(只需从您的 元素中删除“工厂”属性)...您可能会有更好的运气。

【讨论】:

  • 谢谢克里斯托弗,我已经按照你的建议做了,现在没有问题了!!
  • 这里是我的 context.xml 我也将类型更改为:type="javax.sql.DataSource"
  • 我最初没有注意到“type”属性:我怀疑这比您更改连接池的影响更大。尝试返回 Oracle 的池并将“类型”保留为“javax.sql.DataSource”。
  • 有错误:原因:javax.naming.NameNotFoundException: JNDI object with [java:comp/env/jdbc/OracleDB] not found: JNDI implementation returned null
【解决方案2】:

只能看到 1 个问题,您的 web.xml 文件中的 res-type 不应该是 javax.sql.DataSource

 <res-type>javax.sql.DataSource</res-type>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2015-03-23
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多