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)
相关推荐
- `socketTimeout`和`connectionTimeout`:控制超时时间,避免长时间无响应。 **5. 兼容性与安全性** 随着版本的升级,`jdbc-sqlserver驱动`不断适应新的SQLServer版本和JVM环境,同时也提升了安全性,如支持SSL...
在数据库连接技术中,Java Database Connectivity (JDBC) 是一种用于执行 SQL 语句的标准 Java API,可以为多种关系数据库提供统一访问。其中,Oracle 提供了两种主要类型的 JDBC 驱动:JDBC-Oracle-Thin 和 OCI...
4. SQLJDBC 4.2:这是SQLJDBC的一个重要升级,它带来了对Java SE 8及以上版本的全面支持,包括Java 8的新日期和时间API。此外,4.2版本还引入了对行级别的结果集缓存,提高查询效率,以及对更大的数据类型(如超过2...
《SQLJDBC4-4.0.jar:微软SQL Server与Java的桥梁》 在Java编程环境中,连接数据库是一项常见的任务,而SQLJDBC4-4.0.jar是Microsoft SQL Server数据库管理系统与Java应用程序之间交互的重要组件。这个jar文件是...
6. **缓存预读**:在连接初始化时执行SQL语句,提高应用程序性能。 在Spring Boot中集成Tomcat JDBC连接池非常简单。只需在`application.properties`或`application.yml`中配置数据源的相关属性,例如: ```...
- 初始化:配置连接池参数,如最大/最小连接数,超时时间等,并初始化连接池。 - 获取连接:提供方法供其他类获取数据库连接,如`getConnection()`。 - 归还连接:当操作完成,需要将连接归还给连接池,如`...
- 在生产环境中,配置合适的JDBC连接超时和最大连接数。 在这个"JDBC--News"案例中,你将学习如何创建新闻表,插入、查询、更新和删除新闻记录,以及如何在用户界面展示这些新闻。这涵盖了JDBC的大部分基础操作,...
9. **性能优化**:通过设置JDBC连接参数,如超时、批处理大小、缓冲区大小等,可以优化与SQL Server的交互性能。 10. **安全性**:JDBC驱动支持使用集成Windows身份验证、SQL Server身份验证或其他认证机制,以及...
SQLJDBC驱动程序允许Java开发者使用标准的JDBC API来执行SQL语句、处理结果集、事务管理和数据库连接管理。这些驱动程序在Java应用服务器、Web应用,如JSP(JavaServer Pages)中特别有用,因为它们提供了跨平台的...
7. **优化与性能**:Hive JDBC还提供了优化选项,例如预编译SQL语句、批量提交、设置超时限制等,以提升性能和减少网络开销。 8. **分页查询**:虽然Hive SQL本身不支持传统的LIMIT和OFFSET分页,但Hive JDBC允许...
**JDBC连接SQL Server例子详解** Java JDBC (Java Database Connectivity) 是Java平台中用于与数据库交互的一组标准API,它允许Java程序通过JDBC驱动程序与各种类型的数据库进行通信。在本例中,我们将深入探讨如何...
4. 配置连接池:设置初始化连接数、最大连接数、超时时间、空闲连接检测等参数,以适应不同应用场景。 三、数据库类型 1. SQL Server 2000/2005:微软的数据库管理系统,广泛应用于企业级应用,支持T-SQL语法,有...
17. **validationQueryTimeout**:验证查询的超时时间,以秒为单位。小于等于 0 表示禁用。默认是 -1。 18. **validatorClassName**:自定义验证器类,实现 `org.apache.tomcat.jdbc.pool.Validator` 接口,用于...
JDBC驱动程序则是Java开发人员用来与SQL Server交互的接口,它允许Java代码执行SQL查询、更新数据库等操作。 描述中提到的"jdbc sqlserver2014 支持2008 2014 2016"意味着这个JDBC驱动程序不仅适用于SQL Server ...
它实现了JDBC 3.0规范,提供了连接、执行SQL语句、处理结果集等功能。如果你的应用程序运行在较旧的Java环境中,或者只需要基本的JDBC功能,那么这个驱动就足够了。 2. **sqljdbc4.jar**: 这个版本的驱动主要是为...
11. **性能优化**:通过配置JDBC连接参数,如超时设置、连接池大小、批处理大小等,可以进一步优化`sqljdbc4`的性能。 总之,`sqljdbc4`作为微软提供的JDBC驱动,为Java开发者提供了便捷、高效的方式来访问和操作...
在Java应用程序中,JDBC扮演着桥梁的角色,允许程序执行SQL语句,进行数据查询、插入、更新和删除等操作。 **1. JDBC API概述** JDBC API主要由以下组件构成: - `java.sql.DriverManager`: 它是JDBC的核心,负责...
3. **建立连接**:使用JDBC连接SQL Server的基本步骤包括加载驱动、创建Connection对象、创建Statement或PreparedStatement对象,最后执行SQL查询。下面是一个示例代码片段: ```java import java.sql.*; public ...
3. **执行SQL**:通过`Connection`对象创建`Statement`或`PreparedStatement`实例,然后执行SQL查询、更新等操作。例如: ```java Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(...
标题 "sqlserver--jdbc_2.0的jar" 指的是SQL Server数据库与Java应用程序之间的连接桥梁,即Microsoft SQL Server JDBC驱动程序的一个版本。这个驱动程序是Java Database Connectivity (JDBC) API的一个实现,允许...