oracle 17410什么错
1个回答
2017-01-20 · 知道合伙人互联网行家
关注
展开全部
应该是数据库连接不正常导致的,
排查原因:
网络问题,内网之中访问,无防火墙,不是网络原因。
网上说是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
>
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean
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>
在生产上测试,问题得到解决。
排查原因:
网络问题,内网之中访问,无防火墙,不是网络原因。
网上说是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
>
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean
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>
在生产上测试,问题得到解决。
ZESTRON
2024-09-04 广告
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸...
点击进入详情页
本回答由ZESTRON提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |