簡體   English   中英

JDBC 連接耗時太長

[英]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);

其中spOutputspInput是 HashMap。

我的配置有問題嗎? TIA。

我也有完全相同的問題。 我發現該問題與特定查詢一致,檢查了該查詢並發現該問題出在查詢本身內。 單獨運行查詢也需要時間。 查詢正在將一列轉換為較低的列,並且該列未編入索引。 查詢就像lower(trim(column_name)),刪除了lower和trim。 在那之后它工作得很好。

附加代碼有所幫助,但我沒有看到其中會導致您所看到的問題的任何內容。 您看到的問題最可能的原因是連接被從池中拉出,但它們沒有被返回,並且池最終變得飢餓。 dbcp 池稍后會阻止您關閉,因為這些連接仍然打開,並且可能掛起。

要進行驗證,您可以嘗試將 maxActive 和類似設置設置為低得多的值,甚至可能是“1”,然后驗證您是否會立即遇到相同的問題。

您是否已驗證您的存儲過程正在返回? 即您實際上每次調用都會得到spOutput並且存儲過程本身不是一致或隨機掛起的?

如果是這樣,我唯一的其他建議是發布更多代碼,尤其是從通向GetDataDao的調用堆棧,並包括 DAO 中進行 sp.execute 調用的任何方法。 假設您沒有使用事務,但如果您使用了,那么在代碼中顯示您開始/提交事務的位置也非常重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM