最近做了一个基于手机客户端webview技术的小项目,项目的架构很简答,就是Spring MVC+Hibernate,后端的数据库为Oracle 10g,项目初期功能非常简单,就是简单的单点登录功能,登录完成之后,就简单的记录一下登录日志。项目在测试环境顺利测试通过,上线到的生产环境,因为是新项目,没有对外发布,只是内部测试使用,访问量非常的小,但是就是这样的情况下,系统竟然报错了,异常如下
Hibernate: insert into T_USER_LOGIN_LOG (LOGIN_TYPE, BAK1, MOBILE, LOGIN_TIME, BAK3, LOGIN_COST_TIME, BAK2, serv_id, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?) 2014-08-19 00:17:11,180 [WARN] - SQL Error: 17410, SQLState: null [org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExcept ionReporter.java:100)] 21753832 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] WARN org.hibernate.util.JDBCExceptionRepor ter - SQL Error: 17410, SQLState: null 21753832 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] WARN org.hibernate.util.JDBCExceptionRepor ter - SQL Error: 17410, SQLState: null 2014-08-19 00:17:11,181 [ERROR] - 无法从套接字读取更多的数据 [org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionRe porter.java:101)] 21753833 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR org.hibernate.util.JDBCExceptionRepo rter - 无法从套接字读取更多的数据 21753833 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR org.hibernate.util.JDBCExceptionRepo rter - 无法从套接字读取更多的数据 2014-08-19 00:17:11,181 [WARN] - SQL Error: 17410, SQLState: null [org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExcept ionReporter.java:100)] 21753833 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] WARN org.hibernate.util.JDBCExceptionRepor ter - SQL Error: 17410, SQLState: null 21753833 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] WARN org.hibernate.util.JDBCExceptionRepor ter - SQL Error: 17410, SQLState: null 2014-08-19 00:17:11,182 [ERROR] - 无法从套接字读取更多的数据 [org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionRe porter.java:101)] 21753834 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR org.hibernate.util.JDBCExceptionRepo rter - 无法从套接字读取更多的数据 21753834 [[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR org.hibernate.util.JDBCExceptionRepo rter - 无法从套接字读取更多的数据 2014-08-19 00:17:11,183 [ERROR] - Could not synchronize database state with session [org.hibernate.event.def.AbstractFlushingEventLi stener.performExecutions(AbstractFlushingEventListener.java:324)] org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:14
只是一条简单的insert语句,没有其他复杂的业务逻辑,而且这个问题在测试环境上也没有出现过,而且还是偶尔出现。
从错误上看,应该是数据库连接不正常导致的,
排查原因:
- 网络问题,内网之中访问,无防火墙,不是网络原因。
- 网上说是Oracle 版本的Bug,经分析,Oracle相关的bug不会影响到现在的Oracle版本,不是版本bug原因。
- JDBC版本原因,可能会是该原因导致的,遂将JDBC的版本升级到和Oracle版本相符的版本,但是问题依然存在。
在绝望是时候突然想到,生产的Oracle和测试的Oracle唯一的区别是:生产的Oracle对长期闲置的数据库连接会自动断开,而我们系统使用的数据库连接池是Apache的DBCP的BasicDataSource连接池。
于是就在本地的Oracle中修改idle_time参数为一分钟,测试,果然出现了同样的问题,问题的根源找到,但是如何解决呢?
现在问题是:Oracle将数据库连接断开了,但是连接池却认为该连接是可以用的,就将该连接分配给了应用程序使用,连接池和应用程序在分配和使用该连接之前没有校验数据库连接的可用性。
查看DBCP的文档和源码,发现有这4个属性可以用:
- validationQuery属性,将从连接池中获取的数据库连接返回给调用者之前,通过这个sql查询判断其有效性, 如果设置,这个查询sql必须至少有一条数据 ,可将该属性设为select 1 from dual
- testOnBorrow属性,确定从连接池中获取的对象是否有效,如果无效从连接池移除,然后尝试下一个对象,这个属性默认为true,可以不设置
- testOnReturn属性,放回连接池之前判断对象是否有效,这个属性默认为false,建议设为true
- testWhileIdle属性,通过空闲对象驱逐器判断对象是否有效,如果无效从连接池移除,默认为false。
至此,增加这些属性之后,连接池的配置如下
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>${jdbc.driverClassName}</value> </property> <property name="url"> <value>${jdbc.url}</value> </property> <property name="username"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="maxActive"> <value>20</value> </property> <property name="maxIdle"> <value>3</value> </property> <property name="maxWait"> <value>-1</value> </property> <property name="defaultAutoCommit"> <value>false</value> </property> <!-- 将从连接池中获取的数据库连接返回给调用者之前,通过这个sql查询判断其有效性 --> <!-- 如果设置,这个查询sql必须至少有一条数据 --> <property name="validationQuery"> <value>select 1 from dual</value> </property> <!-- 确定从连接池中获取的对象是否有效,如果无效从连接池移除,然后尝试下一个对象 --> <property name="testOnBorrow"> <value>true</value> </property> <!-- 放回连接池之前判断对象是否有效--> <property name="testOnReturn"> <value>true</value> </property> <!-- 通过空闲对象驱逐器判断对象是否有效,如果无效从连接池移除 --> <property name="testWhileIdle"> <value>true</value> </property> </bean>
在生产上测试,问题得到解决。
相关推荐
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
Oracle数据库发生ORA-04031错误原因浅析及处理 Oracle数据库是甲骨文公司提供的一种分布式数据库管理系统,以分布式数据库为核心的软件产品。它具有完整的数据管理功能,作为一个关系数据库,它是一个非常实用的...
在使用Oracle Data Pump工具IMPDP(Import Data Pump)进行数据导入的过程中,可能会遇到ORA-39002和ORA-39070等错误。本文将针对这些错误的排查方法进行详细介绍,帮助用户理解问题的原因及解决策略。 ### 错误...
### Oracle 10g启动后报ORA-16038错误的解决方法 #### 错误概述 在启动Oracle 10g数据库时遇到ORA-16038错误,该错误通常与归档日志操作有关。具体错误信息为: ``` ORA-16038: log 1 sequence #230 cannot be ...
### ORA-01460 错误原因分析 #### 概述 在Oracle数据库操作过程中,可能会遇到ORA-01460错误,该错误全称为“ORA-01460: 转换请求无法实现或不合理”。这一错误通常发生在数据类型转换或者与操作系统之间的数据...
### 创建物化视图ORA-12014错误解决方法 #### 背景介绍 在Oracle数据库中,物化视图(Materialized View)是一种用于优化查询性能的重要工具。它预先计算并存储了复杂的查询结果,从而在实际查询时能够快速地返回...
### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...
### 如何处理错误ORA-29275:部分多字节字符 #### 问题背景与描述 在Oracle数据库操作过程中,用户可能会遇到一个特定的错误提示——ORA-29275:部分多字节字符。这一错误通常出现在执行查询`SELECT * FROM V$...
Oracle数据库不同版本间的客户端与服务端的连接问题通常涉及到安全和兼容性配置,这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决...
### Oracle ORA-03113 错误解析及解决方法 #### 一、ORA-03113 错误概述 ORA-03113 是一个较为常见的Oracle错误,通常出现在网络通信出现问题时,具体表现为“end-of-file on communication channel”(通信通道上...
在IT领域,尤其是在数据库管理与维护中,遇到ORA-01460错误是常见的问题之一,这通常意味着系统在尝试执行数据转换时遇到了未实现或不合理的请求。本文将深入探讨ORA-01460错误的成因、影响以及提供一系列有效的解决...
关于WIN10系统使用oracle instant client 时候提示ORA-01019错误的解决方案,本方案是配置好环境变量后依然提示ORA-01019错误的解决方案,内附本人制作测试的全过程说明
这些问题可能会导致数据库启动时出现ORA-01033错误(数据库无法完成启动过程),以及在尝试修复过程中可能遇到的ORA-01145错误(除非启用了介质恢复,否则不允许立即脱机)。本文将详细介绍这两种错误的原因、可能的...
ORA-00604: 递归SQL层1出现错误 ORA-03106: 致命的双工通信协议错误 ORA-02063: 紧接着line(源于dblink) 以及 ORA-04052: 在查找远程对象时出错 ORA-00604: 递归SQL层1出现错误 ORA-03120: 双工转换例行程序:整数...
在创建Oracle数据库连接时遇到的错误ORA-01017和ORA-02063涉及到用户认证问题以及Oracle数据库版本之间的差异处理。ORA-01017错误表示用户名或密码无效,登录被拒绝,而ORA-02063则通常表示在Oracle数据库之间进行...
在Oracle数据库管理与维护的过程中,遇到各种错误代码是家常便饭,其中“ORA-227101”错误虽然在题目中被误标,实际案例中展示的是“ORA-27101”错误,这是一个较为常见的问题,通常发生在数据库服务未能正确启动或...
ORA-12514 错误的原因和解决方法 ORA-12514 错误是 Oracle 数据库中常见的一种错误,它的出现可能是由于多种原因引起的。下面我们将从根本上探究 ORA-12514 错误的原因,并提供相应的解决方法。 原因 1:监听器没有...
### ERwin连接Oracle报ORA-01041内部错误,hostdef扩展名不存在的知识点解析 #### 一、问题背景及概述 在使用ERwin数据建模工具连接Oracle数据库时,可能会遇到ORA-01041内部错误提示:“hostdef扩展名不存在”。...
然而,在日常运维过程中,我们可能会遇到各种错误,比如“ORA-00702”就是其中之一。这个错误通常在尝试重启Oracle数据库服务时出现,意味着数据库实例在启动过程中遇到了问题。本文将详细介绍如何在Windows和Linux...