背景:雲Sql Server的JDBC連接重置錯誤:只有在Amazon EC2上
我們有一個基於Java的Web應用程序,我們在我們自己的服務器託管正常。最近我們使用Amazon Web Services(AWS EC2)雲來託管一個實例。
此「雲端設置」符合我們典型的「現場」設置:應用服務器的一臺服務器,數據庫服務器的另一臺服務器。 (幾個應用服務器指向同一數據庫服務器)
在這種雲設置中,我們接收間歇「連接重置由對等的錯誤」的數據庫,並且JDBC驅動,其中,在(貌似)隨機時間間隔之間的問題並且在代碼庫中的隨機點上,數據庫連接失敗。
以下是日誌幾個錯誤摘錄
堆棧跟蹤實施例1:
at com.participate.pe.genericdisplay.client.taglib.GenDisplayViewTag.doStartTag(GenDisplayViewTag.java:77)
... 75 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:304)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getMetaData(SQLServerConnection.java:1734)
at org.jboss.resource.adapter.jdbc.WrappedConnection.getMetaData(WrappedConnection.java:354)
堆棧跟蹤實施例2
at java.lang.Thread.run(Thread.java:619)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1368)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1355)
at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1532)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(IOBuffer.java:3274)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4437)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(IOBuffer.java:4389)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:1457)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectionCommand(SQLServerConnection.java:1462)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.setAutoCommit(SQLServerConnection.java:1610)
at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.checkTransaction(BaseWrapperManagedConnection.java:429)
技術環境
- 的Jboss 4.2.2.GA(JBoss的Web 2.0的/ Tomcat的6)
- MSSQL 2005年2.0 JDBC驅動程序
幾點
- 我們有從未見過這個問題在 我們自己的環境(即自己的數據中心)運行該應用程序幾年
- 這導致我總結「有趣的事情正在與亞馬遜網絡環境進行」。我可能是錯的/錯過了某些東西/等等。
- 這個問題只發生在我們的應用程序中。我們有其他的Java和PHP應用程序沒有這個問題。其他Java應用程序使用不同的JDBC驅動程序(JTDS,據我所知)
- 它似乎並不像一個簡單的連接超時
問題
都具有一個沒有人見過這個? - 如果這是一個EC2「已知問題」,我們可以配置我們的方式解決問題(即確保一切都在自己的子網或虛擬私有云(vpc)? - 任何jdbc驅動程序設置來解決這個問題?
** **更新我 延伸過關於這個問題增加了賞金
在信息額外位:兩個虛擬服務器(數據庫和應用服務器)爲不同的子網 - 即一個跳。兩臺服務器之間。
在非雲環境中,我們有兩個服務器「零跳」。
我們的託管管理員表示我們無法控制我們的EC2實例的子網。這讓我懷疑虛擬私有云是否會有所幫助。提前
感謝
將
您是否嘗試將JDBC驅動程序切換至jTDS?應該是一個簡單的嘗試。 – MicSim 2011-06-06 20:37:25
驅動程序更改將需要完整的qa週期。從理論上講,所有jdbc驅動程序的工作原理都是一樣的(即「理論上的共產主義有效」)......實際上,它們有輕微的變化......所以在這一點上它不適合我們。 – user331465 2011-06-06 20:52:32
您是否在應用程序中的多個線程之間共享連接?或者是否有像防火牆這樣的網絡元件在預設的時間量後斷開連接(恐怕我對EC2不瞭解)?第二個堆棧跟蹤是從通道讀取時遇到IOException的結果。由於基礎邏輯連接(SQLServerConnection實例)本身先前已關閉,因此異常本身處理不正確。這表明邏輯連接是共享的,或者底層物理連接被中斷。 – 2011-06-11 15:01:10