Heim  >  Artikel  >  Java  >  So lösen Sie das SQL-Ausführungszeitlimit der Springboot-Konfiguration Mybatis

So lösen Sie das SQL-Ausführungszeitlimit der Springboot-Konfiguration Mybatis

WBOY
WBOYnach vorne
2023-05-15 18:10:252872Durchsuche

Wenn einige SQL-Anweisungen aus unbekannten Gründen blockiert werden, möchten wir, um die Ausführung des Hintergrunddienstes nicht zu beeinträchtigen, das Ausführungszeitlimit für SQL erhöhen und nach dem Timeout eine Ausnahme auslösen, um sicherzustellen, dass der Hintergrund-Thread ausgeführt wird wird aufgrund einer SQL-Überlastung nicht blockiert.

1. Yml globale Konfiguration

Eine einzelne Datenquelle ist in Ordnung, schlägt jedoch fehl, wenn mehrere Datenquellen verwendet werden

So lösen Sie das SQL-Ausführungszeitlimit der Springboot-Konfiguration Mybatis#🎜 🎜##🎜 🎜#2. Java-Konfigurationsklassenkonfiguration

Löst erfolgreich eine Timeout-Ausnahme aus.

 import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 
import javax.sql.DataSource;
 
@Configuration
@MapperScan(basePackages = "top.oldmoon.bill.mapper", sqlSessionFactoryRef = "sqlSessionFactory")
public class DBConfiguration {
 
    @Primary
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource gfDataSource() {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return dataSource;
    }
 
    @Primary
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory gfSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
 
        factoryBean.setDataSource(dataSource);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/*.xml"));
 
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setDefaultStatementTimeout(1); // 设置sql执行超时时间::(秒)
        factoryBean.setConfiguration(configuration);
        SqlSessionFactory sqlSessionFactory = factoryBean.getObject();
        return sqlSessionFactory;
    }
 
    @Primary
    @Bean(name = "transactionManager")
    public DataSourceTransactionManager gfTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Primary
    @Bean(name = "sqlSessionTemplate")
    public SqlSessionTemplate gfSqlSessionTemplate(
            @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
        return sqlSessionTemplate;
    }
}

Fr 12. März 15:56:31 CST 2021--方法开始执行!!
2021-03-12 15:56:38.508 FEHLER 24484 --- [nio-8111-exec-3] o.api.advice .ExceptionHandlerAdvice      : 未知异常:
### Fehler beim Abfragen der Datenbank.  Ursache: com.mysql.cj.jdbc.Exceptions.MySQLTimeoutException: Anweisung aufgrund einer Zeitüberschreitung oder Clientanforderung abgebrochen
### Der Fehler liegt möglicherweise in der Datei [E:space-persionalgitoldmoon-frameoldmoon-app-billoutproduktionresourcesmybatisUserMapper.xml]
## vor. # Der Fehler kann sich auf defaultParameterMap beziehen Kundenwunsch
; Die Anweisung wurde aufgrund einer Zeitüberschreitung oder einer Clientanfrage abgebrochen. Die verschachtelte Ausnahme ist com.mysql.cj.jdbc.Exceptions.MySQLTimeoutException: Anweisung aufgrund einer Zeitüberschreitung oder Clientanforderung abgebrochen
org.springframework.dao.QueryTimeoutException: 
### Fehler beim Abfragen der Datenbank.  Ursache: com.mysql.cj.jdbc.Exceptions.MySQLTimeoutException: Anweisung aufgrund einer Zeitüberschreitung oder Clientanforderung abgebrochen
### Der Fehler liegt möglicherweise in der Datei [E:space-persionalgitoldmoon-frameoldmoon-app-billoutproduktionresourcesmybatisUserMapper.xml]
## vor. # Der Fehler kann sich auf defaultParameterMap beziehen Kundenwunsch
; Die Anweisung wurde aufgrund einer Zeitüberschreitung oder einer Clientanfrage abgebrochen. Die verschachtelte Ausnahme ist com.mysql.cj.jdbc.Exceptions.MySQLTimeoutException: Anweisung aufgrund einer Zeitüberschreitung oder Clientanforderung abgebrochen
    bei org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:76)
    bei org.springframework.jdbc .support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
    bei org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
    bei.org.mybatis.spring.MyBatisExceptionTranslator.translateException IfPossible(MyBatisExceptionTranslator.java:73 )
    bei org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    bei com.sun.proxy.$Proxy63.selectList(Unknown Source)
    bei.org.mybatis.spring.SqlSessionTemplate.selectList (SqlSessionTemplate .java:230)
    bei org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
    bei org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
    bei org.apache .ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
    at com.sun.proxy.$Proxy69.testTimeOut(Unknown Source)
    at top.oldmoon.bill.service.impl.UserServiceImpl.testTimeOut(UserServiceImpl.java :32)
    bei top.oldmoon.bill.contoller.UserController.testTimeOut(UserController.java:64)
    bei sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    bei sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62)
    bei sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    bei java.lang.reflect.Method.invoke(Method.java:498)
    bei org.springframework.web.method.support.InvocableHandlerMethod. doInvoke(InvocableHandlerMethod.java:197)
    unter org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
    unter AndHandle( ServletInvocableHandlerMethod.java:106)
    bei org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
    bei.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter . handleInternal(RequestMappingHandlerAdapter.java:808)
    bei org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    bei org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java: 1061)
    bei org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961)
    bei org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    bei org.springframework.web. servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    unter javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    unter org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    unter javax.servlet.http.HttpServlet.service(HttpServlet .java:733)
    bei org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    bei org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    bei org.apache .tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    bei org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    bei org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)
    unter com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
    unter org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
unter org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    unter org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    unter org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119)
    bei org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    bei org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
unter org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    unter org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    unter org.apache.catalina.core.ApplicationFilterChain .internalDoFilter(ApplicationFilterChain.java:193)
    bei org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    bei org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
unter org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    unter org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    unter org.apache.catalina.core.ApplicationFilterChain .doFilter(ApplicationFilterChain.java:166)
    bei org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    bei org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
unter org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    unter org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    unter org.apache.catalina.valves.ErrorReportValve .invoke(ErrorReportValve.java:92)
    bei org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    bei org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
unter org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    unter org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    unter org.apache.coyote.AbstractProtocol$ConnectionHandler.process (AbstractProtocol.java:888)
    bei org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    bei org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java :49)
    bei java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    bei java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    bei org.apache.tomcat.util .threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    bei java.lang.Thread.run(Thread.java:748)
Verursacht durch: com.mysql.cj.jdbc.Exceptions.MySQLTimeoutException: Anweisung fällig abgebrochen zu Timeout oder Client-Anfrage
    bei com.mysql.cj.jdbc.Exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113)
    bei com.mysql.cj.jdbc.StatementImpl.checkCancelTimeout(StatementImpl.java:2191)
    bei com .mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:1028)
    bei com.mysql.cj.NativeSession.execSQL(NativeSession.java:1075)
    bei. com.mysql.cj.jdbc.ClientPreparedStatement.executeIn innerlich (ClientPreparedStatement.java:930)
    at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3409)
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3407)
    at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:167)
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:498)
    at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
    ... 61 more

{
    "resultCode": "2",
    "resultMsg": "未知异常,请联系管理员!",
    "token": null,
    "resultInfo": "\r\n### Error querying database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request\r\n### The error may exist in file [E:\\space-persional\\git\\oldmoon-frame\\oldmoon-app-bill\\out\\production\\resources\\mybatis\\UserMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: select * from V_BGD_PWGM_PB_21\r\n### Cause: com.mysql.cj.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request\n; Statement cancelled due to timeout or client request; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request"
}

Das obige ist der detaillierte Inhalt vonSo lösen Sie das SQL-Ausführungszeitlimit der Springboot-Konfiguration Mybatis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen