[英]JDBC Connection taking too long
我的 Spring MVC JDBC 調用有問題。 如果我在啟動服務器后快速調用,JDBC 連接將在一秒鍾內建立並檢索數據。 類似地,如果其他 DAO 彼此快速連續調用,則很快就會建立連接。 但是,如果我在幾分鍾的間隔后嘗試調用 DAO,則 JDBC 連接需要永遠完成。 它被卡住了
“DataSourceUtils:110 - 從數據源獲取 JDBC 連接”
我從來沒有耐心真正檢查檢索連接需要多長時間,但我已經等了 10 分鍾,但沒有建立連接的跡象。
接下來,我嘗試至少重新啟動服務器。 但是 JDBC 甚至會阻礙服務器的停止!! 控制台卡在這一行:
“DisposableBeanAdapter:327 - 在名為‘dataSource’的 bean 上調用銷毀方法‘close’”
最終我重新啟動 Eclipse,它工作正常,直到再次出現時間間隔。
這是我對數據源的 bean 定義:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="url" />
<property name="username" value="abc" />
<property name="password" value="abc" />
<property name="validationQuery" value="SELECT 1" />
<property name="testWhileIdle" value="true" />
<property name="maxActive" value="100" />
<property name="minIdle" value="10" />
<property name="initialSize" value="10" />
<property name="maxIdle" value="20" />
<property name="maxWait" value="1000" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="getDataDao" class="com.project.dao.GetDataDao">
<constructor-arg index="0" ref="jdbcTemplate" />
<constructor-arg index="1" value="STORED_PROC_NAME"></constructor-arg>
</bean>
在我的 DAO 文件中,我擴展了 Spring 的 StoredProcedure 類,這是構造函數:
public GetDataDao(JdbcTemplate jdbcTemplate, String spName) {
super(jdbcTemplate, spName);
declareParameter(new SqlParameter("p_input", Types.VARCHAR));
declareParameter(new SqlOutParameter("o_result", Types.VARCHAR));
compile();
}
在另一個函數中,這就是我調用 SP 的方式:
spOutput = super.execute(spInput);
其中spOutput
和spInput
是 HashMap。
我的配置有問題嗎? TIA。
我也有完全相同的問題。 我發現該問題與特定查詢一致,檢查了該查詢並發現該問題出在查詢本身內。 單獨運行查詢也需要時間。 查詢正在將一列轉換為較低的列,並且該列未編入索引。 查詢就像lower(trim(column_name)),刪除了lower和trim。 在那之后它工作得很好。
附加代碼有所幫助,但我沒有看到其中會導致您所看到的問題的任何內容。 您看到的問題最可能的原因是連接被從池中拉出,但它們沒有被返回,並且池最終變得飢餓。 dbcp 池稍后會阻止您關閉,因為這些連接仍然打開,並且可能掛起。
要進行驗證,您可以嘗試將 maxActive 和類似設置設置為低得多的值,甚至可能是“1”,然后驗證您是否會立即遇到相同的問題。
您是否已驗證您的存儲過程正在返回? 即您實際上每次調用都會得到spOutput
並且存儲過程本身不是一致或隨機掛起的?
如果是這樣,我唯一的其他建議是發布更多代碼,尤其是從通向GetDataDao
的調用堆棧,並包括 DAO 中進行 sp.execute 調用的任何方法。 假設您沒有使用事務,但如果您使用了,那么在代碼中顯示您開始/提交事務的位置也非常重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.