post

Java项目中超时问题解决方案汇总

很久没写过技术类文章,懒了,今天同事分享了一份超时相关问题的解决办法,我记录到博客上,以备日后所需。多谢龚同学的分享。

在做项目中,遇到比较多的超时问题跟大家分享下,具体超时时间设置多少可以根据监控数据、应用容忍和并发线程执行回收的最大等待时间设定。

1、数据库连接超时设置方法

连接池中不能设置超时,如:jndi、dbcp,对于maxwait的设置是表示在连接池满的时候,取新连接时的等待时间,不是jdbc执行的超时时间
1.1  事务级别超时(可以针对某个事务单独设置)
Transaction timeout is a timeout valid in frameworks (Spring, EJB container) or at the application level.
In Spring, you may use XML as shown below or use @Transactional from Java source codes, for configuration.

<tx:attributes>
        <tx:method name="…" timeout="3"/>
</tx:attributes>

1.2  statment 超时(ibatis的config文件设置定义范围为全局,如果应用中可以统一设置超时,推荐此方法)
To use iBatis as an example, the default value can be configured by using @defaultStatementTimeout (秒) value insqlMapConfig/settings of sql-map-config.xml. By using @timeout value, you can configure statement, select, insert and update syntax of sql-map.xml separately.

1.3  jdbc driver socket 超时(可以针对单个jdbc driver单独设定,请注意超时时间的单位,如果不能统一设置超时,推荐单个连接设置,推荐此方法)
How to configure SocketTimeout is as explained below.

JDBC DriverconnectTimeoutDefaultUnit
socketTimeoutDefaultUnit
Application Method
MySQL DriverconnectTimeout0ms
socketTimeout0ms
Specify the option in the DriverURL.
Format:
jdbc:mysql://[host:port],[host:port]…/[database]
[?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]…
Example:
jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=60000
MS-SQL Driver
jTDS Driver
loginTimeout0sec
socketTimeout0sec
Specify the option in the DriverURL.
Format:
jdbc:jtds:://[:][/][;=[;…]]
Example:
jdbc:jtds:sqlserver://server:port/database;loginTimeout=60;socketTimeout=60
Oracle Thin Driveroracle.net.CONNECT_TIMEOUT0ms
oracle.jdbc.ReadTimeout0ms
Not possible with the driverURL. Must be delivered to the properties object via OracleDatasource.setConnectionProperties() API. When DBCP is used, use the following APIs:
BasicDatasource.setConnectionProperties()
BasicDatasource.addConnectionProperties()
CUBRID Thin DriverNo separate configuration5,000ms
Not possible with the driverURL. Timeout occurs in 5 seconds.
Note 1: When timeout occurs with althost option specified in the URL, it can be connected to the designated host.
Note 2: C API can be used to state the login_time option in ms in the URL.
  • Note 1: The default value for connectTimeout and socketTimeout is “0,” which means that the timeout does not occur.
  • Note 2: You can also configure through properties without directly using the separate API of DBCP.

摘自:http://www.cubrid.org/blog/dev-platform/understanding-jdbc-internals-and-timeout-configuration/

2、ice

默认超时时间为-1,代表是无限期,就是没有超时时间,这就代表server挂了,会一直占用当前client的线程。
建议:在链接时加上 tcp -h xx -p xxx -t 2000 或者objectPrx.ice_timeout(2000) 单位为毫秒

3、cxf

默认连接时间超时为30秒,等待响应时间为60秒。这就代表server挂了,会一直占用当前client的线程最长30秒以上。
建议:
3.1.cxf spring xml beans头文件增加:

xmlns:context="http://www.springframework.org/schema/context"
       xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
      http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd"
<http-conf:conduit name="*.http-conduit">
   <http-conf:client ConnectionTimeout="2000" ReceiveTimeout="5000"/>单位为毫秒
</http-conf:conduit>

3.2.在资源文件目录下增加cxf.xml,cxf会自动读取(推荐):

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
       xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
           http://cxf.apache.org/schemas/configuration/http-conf.xsd
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
      <http-conf:conduit name="*.http-conduit">
        <http-conf:client ConnectionTimeout="2000" ReceiveTimeout="5000"/>单位为毫秒
       </http-conf:conduit>
</beans>

Comments

  1. 你猜我看得懂不》??

  2. 你猜我看得懂不》??

  3. 呃 java

  4. 呃 java

  5. 博客做的不错,来踩踩,求回访

  6. 博客做的不错,来踩踩,求回访

  7. java还真的不懂额

  8. java还真的不懂额

  9. 看不懂的飘过

  10. 看不懂的飘过

  11. 讨厌JAVA

  12. 讨厌JAVA

  13. 看成了:中超,哈哈,不是足球。

  14. 看成了:中超,哈哈,不是足球。

  15. 博客做的不错,来踩踩,求回访

  16. 博客做的不错,来踩踩,求回访

  17. 衡哥牛逼,我在Google上搜索第四个就是你这篇博客!https://www.google.com.hk/search?newwindow=1&safe=strict&es_sm=93&q=java+spring+%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E8%B6%85%E6%97%B6&spell=1&sa=X&ei=x4xrU6zgFMrg8AWFw4CAAQ&ved=0CCYQvwUoAA&biw=1920&bih=932

  18. 衡哥牛逼,我在Google上搜索第四个就是你这篇博客!https://www.google.com.hk/search?newwindow=1&safe=strict&es_sm=93&q=java+spring+%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E8%B6%85%E6%97%B6&spell=1&sa=X&ei=x4xrU6zgFMrg8AWFw4CAAQ&ved=0CCYQvwUoAA&biw=1920&bih=932

Trackbacks

  1. […] Java项目中超时问题解决方案汇总 […]

Speak Your Mind

*

· 2,709 次浏览