這段時間遇到一個問題就是ReportService 中采用了遠程連接的報表偶爾會斷開連接,導致報表導出異常,查閱了很多資料,幾天來就是斷斷續續的終於解決了這個問題,下面把一些解決的點一一展示出來,便於大家將來遇到同樣問題無從下手。
首先是報錯,接下來我馬上去看日志,很多人不知道文件的位置,一般默認就是這個路徑(Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\LogFiles)。
主要的錯誤如下:
1. System.Data.SqlClient.SqlException: 超時時間已到。在操作完成之前超時時間已過或服務器未響應。
2. 偶爾還會連接池已滿等錯誤。
綜合一下,問題是時而有,大多數時候沒有,那么我將問題集中到兩個地方一個是數據量過大導致連接超時,另一個是網絡、參數等配置問題。
過濾情況:
1.采用了遠程數據庫,不是共享數據源(SharePoint),因此排除了更新數據后對數據源的同步問題。(如果是則需要確保每次看之前數據源得到更新)
2.域賬戶權限問題,雖然是域內訪問,當時權限沒有問題,因為大多數時候是可以訪問的。(否則需要添加訪問權限)
3. 遠程服務器環境,也沒有問題,數據庫允許遠程連接,且硬盤環境沒有問題。(否則會顯示low disk condition within the database)
接下來是我經過綜合分析修改的幾個地方:
1.配置設置是在 RSReportServer.config 文件中指定的參數。
a.計划內和計划外回收操作,影響應用程序池的回收。這個在C#部分將來可以詳細討論
<RecycleTime>720</RecycleTime>
<MaxAppDomainUnloadTime>30</MaxAppDomainUnloadTime>這兩個值默認即可。
b.<Add Key="DatabaseQueryTimeout" Value=""/> 查詢超時時間盡量設置大一些,當然在一些環境下不能這么做比如頻繁查詢的,數據量較小的時候。對於我的報表系統而言,用的比較少且很多大的報表所以設定為30分鍾。
2.修改web.config中的參數
httpRuntime是配置asp.net http運行時設置,以確定如何處理對asp.net應用程序的請求。
executionTimeout:表示允許執行請求的最大時間限制,單位為秒
maxRequestLength:指示 ASP.NET 支持的最大文件上載大小。該限制可用於防止因用戶將大量文件傳遞到該服務器而導致的拒絕服務攻擊。指定的大小以 KB 為單位。默認值為 4096 KB (4 MB)。
類似於C#中CommandTimeout 這個參數就是我們的執行時間超時值,如果太小就會引發執行失敗。
3.接下來就是對RS 的參數修改
a.設置站點設置-》常規
其中在RSDB中也可以設置這個值,參數為默認為600or1800。直接選擇不設置。
b.對於數據集的參數設置
首先在開發的時候就可以設置比如timeout時間。一般默認為0.然后這里我做了如下修改
注意這個地方是關鍵,對於這種共享數據源的數據集也要設置,選擇不對報表時間設置超時,或者指定超時時間。默認值我推測可能是15or30。這樣在wait時極有可能造成超時。
當然以上只是我的最后得出的推論,還需要注意一下幾點:
1.這期間修改了很多地方比如連接參數修改過connection timeout 參數,maxpool等
2.有一些地方的配置也需要注意,比如遠程連接中盡量采用IP地址作為連接對象,盡量不要使用服務器縮寫名稱,這樣在DNS匹配的時候經常會影響,尤其是涉及到服務器遷移的時候會出問題。其次會影響響應速度。有些時候設置需要清洗DNS的匹配。
3.服務器端的防火牆配置,添加出站入站規則,一般默認端口1433,否則需要制定規則。
4.RS報表或者其他的連接方式
對於.net之類的微軟程序盡量選擇SQLServer 的數據源,這樣速度更快尤其是SSRS已經SSIS,如果非微軟數據源,可采用oledb等,但是注意升級數據庫,使用最新的驅動程序。
總結
由於這個偶爾斷開的連接問題,讓我斷斷續續地看了好多資料但是真正解決起來才發現小的知識點很多,這里也不過多展開了。報表這塊由於太占資源必須經常性的檢查優化。這期間監測網絡是否暢通,數據庫環境是否出現問題等都是要做好自動化監控的。
補充:
突然想起來一個老問題,是關於網絡連接問題引發的數據庫訪問異常。也會引發類似的問題,涉及到遠程鏈接訪問的。
原因是對於SQLServer 的TCP/IP地址而言默認訪問IPV4地址。所以當服務器上有IPV6地址時,會去訪問IPV6從而引發連接超時等現象。具體的修復步驟如下:
1.不需要用IPv6的話直接在網絡連接中將Ipv6的選項勾掉然后應用即可。如圖:
2. 如果必須使用IPv6,則需要執行以下步驟:
- 打開SQLServer 配置管理器
- 點擊網絡配置下面的協議
- 右側點擊TCP/IP,右鍵屬性。
- 為每一個IP地址的端口號都輸入你的默認端口號,然后活動和啟用都選擇是。應用即可
- 如有必要還要添加端口或者程序的入站規則(端口),出站規則。







