`

JDBC- SQL执行超时时间

 
阅读更多

 

 java jdbc 的Statement 接口中定义了setQueryTimeout 方法,该方法API:

void setQueryTimeout(int seconds)
                     throws SQLException
将驱动程序等待 Statement 对象执行的秒数设置为给定秒数。如果超过该限制,则抛出 SQLException。
JDBC 驱动程序必须将此限制应用于  execute、executeQuery 和 executeUpdate 方法。
JDBC 驱动程序实现也可以将此限制应用于 ResultSet 方法
(有关详细信息,请参考驱动程序供应商文档)。
参数:
seconds - 以秒为单位的查询超时限制;0 表示没有任何限制
抛出:
SQLException - 如果发生数据库访问错误,在已关闭的 Statement 上调用此方法,或者不满足条件 seconds >= 0
另请参见:
getQueryTimeout()

 

  即如果数据库jdbc驱动支持情况下,可实现超时异常,这对于某些情况特别有用:

      1. sql执行时间特别长,导至执行线程长时间阻塞,减低请求处理的吞吐量。

      2. sql执行产生死锁,或等待另外的连接释放锁,而一直阻塞。

       

 MyBatis设置setQueryTimeout的方式:

   

  1.mybatis配置的xml中配置:

   

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--设置SQL执行超时时间,超时抛出异常-->
        <setting name="defaultStatementTimeout" value="30"/>
    </settings>
</configuration>

  2.在sql配置的xml中配置timeout,优先级高于1

 

 <update id="updateName" timeout="20">
        update my_table set name=#{param1} where  id= #{param2}
    </update>

 

 MyBatis 在哪块调用Statement.setQueryTimeout方法??

  

public abstract class BaseStatementHandler implements StatementHandler {
 @Override
  public Statement prepare(Connection connection) throws SQLException {
    ErrorContext.instance().sql(boundSql.getSql());
    Statement statement = null;
    try {
      statement = instantiateStatement(connection);
      setStatementTimeout(statement);//设置sql执行超时时间
      setFetchSize(statement);
      return statement;
    } catch (SQLException e) {
      closeStatement(statement);
      throw e;
    } catch (Exception e) {
      closeStatement(statement);
      throw new ExecutorException("Error preparing statement.  Cause: " + e, e);
    }
  }
   protected void setStatementTimeout(Statement stmt) throws SQLException {
    Integer timeout = mappedStatement.getTimeout();
    Integer defaultTimeout = configuration.getDefaultStatementTimeout();
    if (timeout != null) {
	// 如果配置的SQL中设置了timeout ?
	// 如:
	// <update id="updateName" timeout="20">
       //    update test_user set name=#{param1} where  id= #{param2}
       //  </update>
      //
      stmt.setQueryTimeout(timeout);
    } else if (defaultTimeout != null) {
	//如果设置了全局的超时时间
	//如在mybatis 的xml配置文件中Settings 下设置了:
       // <setting name="defaultStatementTimeout" value="20"/>
      stmt.setQueryTimeout(defaultTimeout);
    }
  }
  
}

 

 

 如果jdbc驱动支持,则超时会抛出异常。

  经测:PostgreSQL 9.5  支持。

  示例异常:

   

Caused by: org.postgresql.util.PSQLException: ERROR: canceling statement due to user request
  在位置:while updating tuple (0,12) in relation "my_table"
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:420)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:413)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:493)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:45)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:73)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:115)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:170)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:386)

 

 

分享到:
评论

相关推荐

    jdbc-sqlserver驱动

    - `socketTimeout`和`connectionTimeout`:控制超时时间,避免长时间无响应。 **5. 兼容性与安全性** 随着版本的升级,`jdbc-sqlserver驱动`不断适应新的SQLServer版本和JVM环境,同时也提升了安全性,如支持SSL...

    jdbc-oracle-thinjdbc-oracle-thin

    在数据库连接技术中,Java Database Connectivity (JDBC) 是一种用于执行 SQL 语句的标准 Java API,可以为多种关系数据库提供统一访问。其中,Oracle 提供了两种主要类型的 JDBC 驱动:JDBC-Oracle-Thin 和 OCI...

    sqljdbc4.0-4.2.zip

    4. SQLJDBC 4.2:这是SQLJDBC的一个重要升级,它带来了对Java SE 8及以上版本的全面支持,包括Java 8的新日期和时间API。此外,4.2版本还引入了对行级别的结果集缓存,提高查询效率,以及对更大的数据类型(如超过2...

    sqljdbc4-4.0.jar

    《SQLJDBC4-4.0.jar:微软SQL Server与Java的桥梁》 在Java编程环境中,连接数据库是一项常见的任务,而SQLJDBC4-4.0.jar是Microsoft SQL Server数据库管理系统与Java应用程序之间交互的重要组件。这个jar文件是...

    tomcat-jdbc-7.0.42.jar

    6. **缓存预读**:在连接初始化时执行SQL语句,提高应用程序性能。 在Spring Boot中集成Tomcat JDBC连接池非常简单。只需在`application.properties`或`application.yml`中配置数据源的相关属性,例如: ```...

    jdbc-utils.rar_Utils_jdbc_jdbc封装

    - 初始化:配置连接池参数,如最大/最小连接数,超时时间等,并初始化连接池。 - 获取连接:提供方法供其他类获取数据库连接,如`getConnection()`。 - 归还连接:当操作完成,需要将连接归还给连接池,如`...

    JDBC--News.rar_知识库

    - 在生产环境中,配置合适的JDBC连接超时和最大连接数。 在这个"JDBC--News"案例中,你将学习如何创建新闻表,插入、查询、更新和删除新闻记录,以及如何在用户界面展示这些新闻。这涵盖了JDBC的大部分基础操作,...

    sqljdbc_9.4\chs.zip

    9. **性能优化**:通过设置JDBC连接参数,如超时、批处理大小、缓冲区大小等,可以优化与SQL Server的交互性能。 10. **安全性**:JDBC驱动支持使用集成Windows身份验证、SQL Server身份验证或其他认证机制,以及...

    sqljdbc和sqljdbc4

    SQLJDBC驱动程序允许Java开发者使用标准的JDBC API来执行SQL语句、处理结果集、事务管理和数据库连接管理。这些驱动程序在Java应用服务器、Web应用,如JSP(JavaServer Pages)中特别有用,因为它们提供了跨平台的...

    hive-jdbc-lib.zip

    7. **优化与性能**:Hive JDBC还提供了优化选项,例如预编译SQL语句、批量提交、设置超时限制等,以提升性能和减少网络开销。 8. **分页查询**:虽然Hive SQL本身不支持传统的LIMIT和OFFSET分页,但Hive JDBC允许...

    JDBC连接SQL Server例子

    **JDBC连接SQL Server例子详解** Java JDBC (Java Database Connectivity) 是Java平台中用于与数据库交互的一组标准API,它允许Java程序通过JDBC驱动程序与各种类型的数据库进行通信。在本例中,我们将深入探讨如何...

    java-jdbc-连接池大礼包

    4. 配置连接池:设置初始化连接数、最大连接数、超时时间、空闲连接检测等参数,以适应不同应用场景。 三、数据库类型 1. SQL Server 2000/2005:微软的数据库管理系统,广泛应用于企业级应用,支持T-SQL语法,有...

    Tomcat jdbc-pool参数详解

    17. **validationQueryTimeout**:验证查询的超时时间,以秒为单位。小于等于 0 表示禁用。默认是 -1。 18. **validatorClassName**:自定义验证器类,实现 `org.apache.tomcat.jdbc.pool.Validator` 接口,用于...

    jdbc sqlserver2014

    JDBC驱动程序则是Java开发人员用来与SQL Server交互的接口,它允许Java代码执行SQL查询、更新数据库等操作。 描述中提到的"jdbc sqlserver2014 支持2008 2014 2016"意味着这个JDBC驱动程序不仅适用于SQL Server ...

    sql server驱动sqljdbc.jar和sqljdbc4.jar

    它实现了JDBC 3.0规范,提供了连接、执行SQL语句、处理结果集等功能。如果你的应用程序运行在较旧的Java环境中,或者只需要基本的JDBC功能,那么这个驱动就足够了。 2. **sqljdbc4.jar**: 这个版本的驱动主要是为...

    sqljdbc4 (SQL连接驱动包)

    11. **性能优化**:通过配置JDBC连接参数,如超时设置、连接池大小、批处理大小等,可以进一步优化`sqljdbc4`的性能。 总之,`sqljdbc4`作为微软提供的JDBC驱动,为Java开发者提供了便捷、高效的方式来访问和操作...

    jdbc jar包

    在Java应用程序中,JDBC扮演着桥梁的角色,允许程序执行SQL语句,进行数据查询、插入、更新和删除等操作。 **1. JDBC API概述** JDBC API主要由以下组件构成: - `java.sql.DriverManager`: 它是JDBC的核心,负责...

    解决JDBC连接SQL-Server数据的办法

    3. **建立连接**:使用JDBC连接SQL Server的基本步骤包括加载驱动、创建Connection对象、创建Statement或PreparedStatement对象,最后执行SQL查询。下面是一个示例代码片段: ```java import java.sql.*; public ...

    jdbc连接sqlserver驱动包

    3. **执行SQL**:通过`Connection`对象创建`Statement`或`PreparedStatement`实例,然后执行SQL查询、更新等操作。例如: ```java Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(...

    sqlserver--jdbc_2.0的jar

    标题 "sqlserver--jdbc_2.0的jar" 指的是SQL Server数据库与Java应用程序之间的连接桥梁,即Microsoft SQL Server JDBC驱动程序的一个版本。这个驱动程序是Java Database Connectivity (JDBC) API的一个实现,允许...

Global site tag (gtag.js) - Google Analytics