日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

No operations allowed after connection closed--转

發布時間:2025/4/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 No operations allowed after connection closed--转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.jianshu.com/p/1626d41572f2

Spring boot的單數據源配置比較簡單,只需要在application.properties配置相關的jdbc連接的參數即可,下面簡單的介紹下spring boot的JdbcTemplate多數據源的配置方式,因為我也是參考程序猿DD寫的多數據源配置的文章來的。
參考鏈接: http://www.jianshu.com/p/34730e595a8c
那么我寫這篇文章的目的,當然不是照抄一遍啦~~~,主要是參考配置完多數據源之后出現了異常,所以重點還是在配置多數據源之后異常問題的解決上做一些簡單的介紹。

JdbcTemplate的多數據源配置

PS:這部分可以參考Spring Boot多數據源配置與使用 ,所以這里直接上配置,簡單明了

DataSourceConfig 配置類

/***創建一個Spring配置類,定義兩個DataSource用來讀取application.properties中的不同配置*/ @Configuration public class DataSourceConfig { private static Logger logger = LoggerFactory.getLogger(DataSourceConfig.class); /************************多數據源配置******************************/ @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix="spring.datasource.primary") public DataSource primaryDataSource() { logger.info("-------------------- primaryDataSource init ---------------------"); return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource() { logger.info("-------------------- secondaryDataSource init ---------------------"); return DataSourceBuilder.create().build(); } /************************JdbcTemplate設置******************************/ @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate( @Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate( @Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } }

application.properties中DataSource配置

#多數據源支持 spring.datasource.primary.url=jdbc:mysql://localhost:3306/test?tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 spring.datasource.primary.username=root spring.datasource.primary.password=root spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.url=jdbc:mysql://localhost:3366/test?tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 spring.datasource.secondary.username=root spring.datasource.secondary.password=root spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

多數據源的調用

/*** 多數據源的使用demo*/ @Service public class KOLDataService { private org.slf4j.Logger logger = LoggerFactory.getLogger(KOLDataService.class); /***********引入多個JdbcTemplate************/ @Autowired @Qualifier("primaryJdbcTemplate") protected JdbcTemplate primaryJdbcTemplate; @Autowired @Qualifier("secondaryJdbcTemplate") protected JdbcTemplate secondaryJdbcTemplate; public JSONObject query(String user_ids){ JSONObject data = new JSONObject(); //primary庫查詢用戶手機號 String query = "select user_id,mobile_id from user where user_id in ("+user_ids+") "; List<JSONObject> listData = primaryJdbcTemplate.query(query, new RowMapper<JSONObject>() { @Override public JSONObject mapRow(ResultSet rs, int rowNum) throws SQLException { JSONObject one = new JSONObject(); one.put("user_id",rs.getInt("user_id")); one.put("mobile_id",rs.getString("mobile_id")); return one; } }); for(int i = 0;i<listData.size;i++){ JSONObject one = listData.get(i); //secondary庫根據用戶名、手機號得到它的歷史瀏覽信息 query = "select title,content,create_time from message_info "+ "where user_id="+one.getInt("user_id")+" and mobile_id = \""+one.getString("mobile_id")+"\""; List<JSONObject> messageData = secondaryJdbcTemplate.query(query, new RowMapper<JSONObject>() { @Override public JSONObject mapRow(ResultSet rs, int rowNum) throws SQLException { JSONObject one = new JSONObject(); one.put("user_id",rs.getInt("user_id")); one.put("mobile_id",rs.getString("mobile_id")); return one; } }); //講歷史瀏覽信息插入到指定用戶下 one.put("info_list",messageData); listData.set(i,one); } //封裝數據 data.put("count",listData.size); data.put("list",listData); return data; } }

上面就是多數據源的相關配置跟使用,如果application.properties中datasource使用的是上述中的application.properties中DataSource配置的話,項目運行8個小時(為啥就8小時呢?繼續往下看就明白了)之后將會出現如下錯誤信息:

org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:305)at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:329) at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214) at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134) at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:97) at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:415) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:470) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:480) 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.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) at com.mysql.jdbc.Util.getInstance(Util.java:387) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:917) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1246) at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1241) at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:2946) at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:2941) 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.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) at com.sun.proxy.$Proxy64.getMetaData(Unknown Source) at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:294) ... 63 common frames omitted Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

No operations allowed after connection closed錯誤原因及解決

之所以會出現這個異常,是因為MySQL5.0以后針對超長時間DB連接做了一個處理,那就是如果一個DB連接在無任何操作情況下過了8個小時后(Mysql 服務器默認的“wait_timeout”是8小時),Mysql會自動把這個連接關閉。這就是問題的所在,在連接池中的connections如果空閑超過8小時,mysql將其斷開,而連接池自己并不知道該connection已經失效,如果這時有 Client請求connection,連接池將該失效的Connection提供給Client,將會造成上面的異常。
所以配置datasource時需要配置相應的連接池參數,定是去檢查連接的有效性,定時清理無效的連接。
解決辦法:
在application.properties的primary數據源的配置下添加如下連接池配置:

#以下為連接池的相關參數配置 spring.datasource.primary.max-idle=10 spring.datasource.primary.max-wait=10000 spring.datasource.primary.min-idle=5 spring.datasource.primary.initial-size=5 spring.datasource.primary.validation-query=SELECT 1 spring.datasource.primary.test-on-borrow=false spring.datasource.primary.test-while-idle=true spring.datasource.primary.time-between-eviction-runs-millis=18800

在application.properties的primary數據源的配置下添加如下連接池配置:

#以下為連接池的相關參數配置 spring.datasource.secondary.max-idle=10 spring.datasource.secondary.max-wait=10000 spring.datasource.secondary.min-idle=5 spring.datasource.secondary.initial-size=5 spring.datasource.secondary.validation-query=SELECT 1 spring.datasource.secondary.test-on-borrow=false spring.datasource.secondary.test-while-idle=true spring.datasource.secondary.time-between-eviction-runs-millis=18800

這樣上述異常就得到解決,其實出現該問題的原因,還是自己本人當時忽略了連接池的相關配置,以及對一些常見連接池的配置尚有欠缺,這里再補充一個小知識點,spring boot默認會優先使用的連接池是tomcat連接池,前提是在tomcat連接池可用的情況下





轉載于:https://www.cnblogs.com/davidwang456/p/8548051.html

總結

以上是生活随笔為你收集整理的No operations allowed after connection closed--转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。