java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
按照黑馬的視訊學習做專案,第一步搭建環境時候。寫好JdbcUtils,測試是否能連線資料庫時候。發現一執行main方法,程式就卡住了,接著就會出以下這2個錯誤:(main方法裡是想輸出 getConnection方法的返回值,也就是connection的雜湊值,這樣就代表獲取連線成功了。)圖如下:
1、Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
2、Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from
按照字面意思就是,連線超時。因為是用的c3p0連線池。所以只能在 c3p0-config.xml 中去尋找錯誤。 配置檔案如下:
<c3p0-config> <!-- 預設配置,如果沒有指定則使用這個配置 --> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/store_40?useSSL=false</property> <property name="user">root</property> <property name="password">123456</property> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> <user-overrides user="test-user"> <property name="maxPoolSize">10</property> <property name="minPoolSize">1</property> <property name="maxStatements">0</property> </user-overrides> </default-config> <!-- 命名的配置 --> <named-config name="itcast"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/store_40?useSSL=false</property> <property name="user">root</property> <property name="password">123456</property> <!-- 如果池中資料連線不夠時一次增長多少個 --> <property name="acquireIncrement">5</property> <property name="initialPoolSize">20</property> <property name="minPoolSize">10</property> <property name="maxPoolSize">40</property> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>
因為沒怎麼使用過c3p0,所以我感覺錯誤應該在這個xml檔案裡,於是仔細確認driverClass,jdbcUrl,user,password這些的值。檢查了好久確認是正確的。於是,又在網上看文件,按照大佬部落格裡的xml中的配置,一直改改改,例如 將maxStatement的值設為0,等等。最後也還是沒解決問題。 最後在黑馬老師的資料文件裡,讀相關說明。發現,視訊裡專案的開發環境是 Tomcat 7.x 和 mysql5.x 。而我的環境是 Tomcat 9.x 和 mysql8.0 ,我估計是環境不同導致的。
專案最初的jar包,是我直接匯入老師資料裡給的jar包。 裡面的mysql的jar包是這個版本,mysql-connector-java-5.1.39-bin.jar,而我在開始這個專案以前用mysql8.0時候的jar包,用的是mysql-connector-java-5.1.45-bin.jar 這個版本。
於是我嘗試將 5.1.39這個版本的資料庫jar包,換成了我之前的 5.1.45版本,最終問題解決。輸出了我想要的東西
(得出一個血的教訓,專案開始前記得先檢查開發環境!!!)