1. 程式人生 > >java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

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

[email protected] -- timeout at awaitAvailable()

按照字面意思就是,連線超時。因為是用的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版本,最終問題解決。輸出了我想要的東西

(得出一個血的教訓,專案開始前記得先檢查開發環境!!!)