想回顧下ssm,看着網上別的帖子手動搭了一個,一直報Could not retrieve transation read-only status server , java.sql.SQLException Unknown system variable 'query_cache_size',這兩個錯.
網上的帖子都是驅動版本不對,折騰了一整天,驅動版本改了,mysql都重新安裝了一遍,最后在我無望的時候,翻到一個帖子...終於爬出了這個坑
【友情提示:不想看我廢話的請直接到文章末尾查看解決方法】
詳細信息: 嚴重 [http-nio-8080-exec-10] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [mvc-dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Unknown system variable 'query_cache_size') ### The error may exist in config/mybatis/sqlXml/article.xml ### The error may involve org.devsong.dao.IArticle.getSiteMapData ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Unknown system variable 'query_cache_size')] with root cause java.sql.SQLException: Unknown system variable 'query_cache_size' ... ...
上面的錯誤看起來是不是很熟悉,沒錯,上面的錯誤在以前升級MySQL的時候,是由於數據庫連接驅動版本過低,與數據庫不匹配。這處理起來很簡單,我也遇到過多次了,直接升級mysql-connector版本就行了。你如果在網上搜索上面的錯誤的話,絕大部分的解決方法也都是升級驅動。
想着已經非常眼熟這個異常了,於是我以一個老司機的姿態像往常一樣更新了Maven依賴配置,像什么都沒發生過一樣重新部署了項目。嘀嘀嘀...錯誤代碼500...我趕緊打開后台看異常信息,我的乖乖,怎么還是上面那個異常,明明更新了驅動的呀。。。至此老司機翻車。
我連滾帶爬地打開代碼,尋找着錯誤,看了一下Spring相關配置,沒問題,看了一下數據庫配置文件,沒問題。於是我開始猜想是不是其他和數據庫相關的東西也該升級了,就這樣,我把數據庫連接池、Spring-jdbc等能升級的都升級。想着異常一定能解決,於是我再一次部署了項目,內心忐忑的我再一次翻車:嘀嘀嘀...錯誤代碼500。。。
連翻兩次車之后,我決定放棄自己折騰了,老老實實去看文檔。我搬出了常年不用的梯子,爬到了牆外,在一個角落里,我看到了某些東西:從MySQL8.0開始,已經支持將驅動寫為com.mysql.cj.jdbc.Driver。在配置數據庫連接的時候,需要加上時區配置。我抱着試一試的心態,修改了一下JDBC配置,在我以為又會失敗時,嘀嘀嘀,成功。。。
下面是舊版配置和新版配置的對比:
#### 舊 版 #### jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password=root #### 新 版 #### jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC jdbc.username=root jdbc.password=root
網上說驅動寫為com.mysql.jdbc.Driver 或者 com.mysql.cj.jdbc.Driver 都行,但我實際測試必須寫為后者才行,並且serverTimezone的設置也不能少,二者缺一不可,少一個就翻車。
更新驅動在這里補充下,pom默認最新版本的.如果上面不行
pom.xml上加上mysql的版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
總結:
(1)更新驅動
(2)更改jdbc配置 --> driver名、serverTimezone
附:
你在折騰的時候或許重裝過MySQL,如果你在卸載重裝的過程中發現Windows服務中充斥着多個MySQL,想刪除的話: Win + R >> CMD >> sc delete 服務名
轉載自:https://www.devsong.org/article/102