簡體   English   中英

Tomcat7數據庫連接超時

[英]Database Connection Timeout Tomcat7

我在哪里可以設置獲取數據庫連接的超時: javax.sql.DataSource.getConnection() in tomcat 7 application server ?

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup(DBManagerConstants.CONTEXT_NAME);
DataSource ds = (DataSource) envContext.lookup(DBManagerConstants.DS_NAME);
conn = ds.getConnection();

我在 Tomcat 7 上有 java web 應用程序,它連接到 Oracle 數據庫。 有一天,在此應用程序無法獲得數據庫連接后,我們的網絡管理員更改了防火牆中的某些內容,但仍然沒有超時和錯誤。 在防火牆應用程序中刪除此更改后(1.5 小時后)繼續工作,就好像什么也沒發生一樣。 這些延遲的連接成功完成了所有操作。

這是我的數據源

<Context>
     <Resource
        name="jdbc/pds"
        auth="Container"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="our.encryptor.EncryptedDataSourceFactory"
        logAbandoned="true"
        maxActive="30"
        maxIdle="10"
        maxWait="1000"
        password="my_password"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@127.0.0.1:8080:SID"
        username="my_user"
        accessToUnderlyingConnectionAllowed="true"
    validationQuery="select 1 from dual" />
</Context>

連接不是持久的物理鏈接

我認為您和其他一些評論者可能會遇到的一些困惑是,當客戶端終止與數據庫的連接時,數據庫不知道該連接已消失,因為它不是實際進行中的物理鏈接,如名稱所暗示的那樣. “數據庫連接”更像是數據庫願意接受和發送數據包的外部 IP 地址的標識符。 “已連接”僅意味着服務器知道客戶端並正在等待數據,但如果客戶端崩潰或消失,服務器不知道。 因此,必須不時手動清除數據庫上的陳舊連接。

如果客戶端嘗試連接您的數據庫,則會創建一個新連接。 現在,如果該客戶端消失,連接仍在數據庫上,因為離線的客戶端不會發送“終止連接”或類似的任何內容。 現在,如果您設置了防火牆或類似的東西,連接將保持有效。 唯一會發生錯誤的情況是,如果客戶端返回並嘗試在防火牆啟動時說話,但如果您關閉防火牆並且客戶端在 9 小時后返回,只要數據庫沒有破壞連接並且客戶端也沒有,然后一切都會從它停止的地方開始“好像沒有發生任何事情”來引用 OP。

您可以通過在本地運行數據庫並嘗試連接到它來對此進行測試。 查看連接控制台,您會看到自己。 終止您用來連接到數據庫的任何客戶端並檢查管理控制台,您將看到數據庫仍在等待,即使您的客戶端不在那里。 數據庫會自行清除這些連接。

連接池

連接池讓你的應用程序可以重用相同的連接來完成它需要做的工作,但是如果你很長時間沒有與數據庫通信,通過你的應用程序,連接可能會過時並被數據庫驅逐,因此連接池如果您嘗試檢索過時的連接,請提供有關如何操作的配置參數。

從 OPs 連接池參數中,validationQuery 字段下方是在您的應用程序上定期運行的內容,以定期檢查池內的連接是否仍然有效。 所有這一切都是因為“連接”不是物理意義上的連接。

<Context>
     <Resource
        name="jdbc/pds"
        auth="Container"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="our.encryptor.EncryptedDataSourceFactory"
        logAbandoned="true"
        maxActive="30"
        maxIdle="10"
        maxWait="1000"
        password="my_password"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@127.0.0.1:8080:SID"
        username="my_user"
        accessToUnderlyingConnectionAllowed="true"
    validationQuery="select 1 from dual" />
</Context>

您可以使用完全限定的連接 URL 並指定 CONNECT_TIMEOUT。 請注意,您可以在此連接 URL 中使用您的 SCAN IP 或服務名稱。 您不能使用 SID。

jdbc:oracle:thin:@(DESCRIPTION= (CONNECT_TIMEOUT=10)(RETRY_COUNT=3)
(ADDRESS_LIST= (LOAD_BALANCE=on)(FAILOVER=ON)
(ADDRESS=(PROTOCOL=tcp)(HOST=sales1-scan)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=sales2-scan)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME= salesservice.example.com)))

(2) OracleConnection.CONNECTION_PROPERTY_THIN_NET_CONNECT_TIMEOUT中有一個Property也可以用來設置這個屬性。 有關更多詳細信息,請參閱 Javadoc。 http://docs.oracle.com/database/121/JAJDB/toc.htm

暫無
暫無

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

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