Lorsque certains SQL sont bloqués pour des raisons inconnues, afin de ne pas affecter le fonctionnement du service d'arrière-plan, nous souhaitons ajouter une limite de temps d'exécution au SQL et lancer une exception après le délai d'attente pour garantir que le thread d'arrière-plan ne sera pas bloqué en raison d'une congestion SQL.
Une source de données unique est OK, mais elle échouera lors de l'utilisation de plusieurs sources de données
lève avec succès une exception de délai d'attente.
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; } }
Vendredi 12 mars 15:56:31 CST 2021--方法开始执行!!
2021-03-12 15:56:38.508 ERREUR 24484 --- [nio-8111-exec-3] o.api.advice .ExceptionHandlerAdvice : 未知异常:
### Erreur lors de l'interrogation de la base de données. Cause : com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : instruction annulée en raison d'un délai d'attente ou d'une demande du client
### L'erreur peut exister dans le fichier [E:space-persionalgitoldmoon-frameoldmoon-app-billoutproductionresourcesmybatisUserMapper.xml]
## # L'erreur peut impliquer defaultParameterMap
### L'erreur s'est produite lors de la définition des paramètres
### SQL : select * from V_BGD_PWGM_PB_21
### Cause : com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : instruction annulée en raison d'un délai d'attente ou demande du client
; Relevé annulé en raison d'un délai d'attente ou d'une demande du client ; L'exception imbriquée est com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : instruction annulée en raison d'un délai d'attente ou d'une demande du client
org.springframework.dao.QueryTimeoutException :
### Erreur lors de l'interrogation de la base de données. Cause : com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : instruction annulée en raison d'un délai d'attente ou d'une demande du client
### L'erreur peut exister dans le fichier [E:space-persionalgitoldmoon-frameoldmoon-app-billoutproductionresourcesmybatisUserMapper.xml]
## # L'erreur peut impliquer defaultParameterMap
### L'erreur s'est produite lors de la définition des paramètres
### SQL : select * from V_BGD_PWGM_PB_21
### Cause : com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : instruction annulée en raison d'un délai d'attente ou demande du client
; Relevé annulé en raison d'un délai d'attente ou d'une demande du client ; L'exception imbriquée est com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : déclaration annulée en raison d'un délai d'attente ou d'une demande du client
sur org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:76)
sur org.springframework.jdbc .support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
sur org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
sur org.mybatis.spring.MyBatisExceptionTranslator.trans lateExceptionIfPossible(MyBatisExceptionTranslator.java:73 )
sur org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
sur com.sun.proxy.$Proxy63.selectList(Source inconnue)
sur org.mybatis.spring.SqlSessionTemplate.selectList(S qlSessionModèle .java:230)
sur org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:139)
sur org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:76)
sur org.apache .ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy69.testTimeOut(Source inconnue)
at top.oldmoon.bill.service.impl.UserServiceImpl.testTimeOut(UserServiceImpl.java :32)
sur top.oldmoon.bill.contoller.UserController.testTimeOut(UserController.java:64)
sur sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sur sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java : 62)
sur sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
sur java.lang.reflect.Method.invoke(Method.java:498)
sur org.springframework.web.method.support.InvocableHandlerMethod. doInvoke(InvocableHandlerMethod.java:197)
sur org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
sur org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle ( ServletInvocableHandlerMethod.java:106)
sur org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
sur org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter. handleInternal(RequestMappingHandlerAdapter.java:808)
sur org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
sur org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java: 1061)
sur org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961)
sur org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
sur org.springframework.web. servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
sur javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
sur org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
sur javax.servlet.http.HttpServlet.service(HttpServlet .java:733)
sur org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
sur org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
sur org.apache .tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
sur org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
sur org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166)
sur com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
sur org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
sur org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
sur org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
sur org.springframework.web.filter.OncePerRequestFilter .doFilter(OncePerRequestFilter.java:119)
sur org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
sur org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
sur org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
sur org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
sur org.apache.catalina.core.ApplicationFilterChain .internalDoFilter(ApplicationFilterChain.java:193)
sur org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
sur org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
sur org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
sur org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
sur org.apache.catalina.core.ApplicationFilterChain .doFilter(ApplicationFilterChain.java:166)
sur org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
sur org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
sur org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
sur org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
sur org.apache.catalina.valves.ErrorReportValve .invoke(ErrorReportValve.java:92)
sur org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
sur org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
sur org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
sur org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
sur org.apache.coyote.AbstractProtocol$ConnectionHandler.process (AbstractProtocol.java:888)
sur org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
sur org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java :49)
sur java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
sur java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
sur org.apache.tomcat.util .threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Causé par : com.mysql.cj.jdbc.exceptions.MySQLTimeoutException : instruction annulée en raison pour un délai d'attente ou une demande du client
sur com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113)
sur com.mysql.cj.jdbc.StatementImpl.checkCancelTimeout(StatementImpl.java:2191)
sur com .mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:1028)
sur com.mysql.cj.NativeSession.execSQL(NativeSession.java:1075)
sur com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal (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" }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!