簡體   English   中英

Spring JDBC錯誤連接

[英]Spring JDBC error connection

我將Tomcat與Spring結合使用(通過Web服務Jersey異步),並在Tomcat中設置池連接,如下所示:

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
    maxActive="100" maxIdle="50" maxWait="10000" name="jdbc/UsersDB"
    password="secret" type="javax.sql.DataSource"  url="jdbc:mysql://localhost:3306/DB"
    username="root" />

例如,在我的JDBC類中,我有:

    public String getMFromToken(String token) {

    logger.info(TAG_LOG + " "
            + "prima della richiesta JDBC id" );

    int id = jdbcTemplateObject.queryForObject(sqlGetToken, new Object [] {token}, Integer.class);

    logger.info(TAG_LOG + " "
            + "recuperato id " + id );

    String sqlGetMFromCred = "select matricola from stud where cred_id = ?";

    logger.info(TAG_LOG + " "
            + "prima della richiesta JDBC matricola" );

    String matricola = jdbcTemplateObject.queryForObject(sqlGetMFromCred, new Object [] {id},String.class);

    logger.info(TAG_LOG + " "
            + "recuperata matricola " + matricola );

    return matricola;
}

如果我長時間不執行對tomcat的請求(要求對數據庫進行查詢的請求),tomcat會向我發送500錯誤,但是如果我調用了任何請求(對數據庫的查詢都不需要對數據庫的查詢),則一切正常。

所以問題是Spring的某些配置(我認為)..如果我等待很長的時間來執行任何請求,為什么Spring不起作用?

對不起,我的英語不好

雖然看到錯誤消息會很有幫助,但聽起來您的MySQL服務器正在斷開池連接。

您說過,只有讓您的應用程序擱置一段時間而不發送任何請求到數據庫時,您才會看到此問題。 當您的應用程序不使用數據庫連接就座時,您的MySQL服務器將看到一段時間未使用連接(如果您控制服務器,則可以配置)並斷開連接。

由於服務器斷開了它們的連接,因此連接池尚未意識到它們已關閉。 這就產生了一個問題,因為下次您使用連接時,該池會使您的應用程序連接失敗。 雖然我不確定,因為我沒有看到確切的錯誤消息,但這肯定會導致您收到500錯誤。

我的建議是,將testOnBorrowvalidationQuery屬性添加到連接池配置中(無論如何,您應該始終設置這些屬性)。 這將指示池將連接指定給應用程序之前,使用您指定的查詢測試連接。 換句話說,該池將過濾掉所有不良連接,並用新的良好連接替換它們。

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
    maxActive="100" maxIdle="50" maxWait="10000" name="jdbc/UsersDB"
    password="secret" type="javax.sql.DataSource"  url="jdbc:mysql://localhost:3306/DB"
    username="root" testOnBorrow="true" validationQuery="SELECT 1" />

暫無
暫無

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

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