Il prodotto è naturalmente freeware e salva una grande quantità di informazioni anche se tralascia qualche informazione importante tipo le variabili di sessione che possono però essere aggiunte intervenendo direttamente sui sorgenti.
Prossimamente, cercherò di pubblicare un mini tutorial su come estendere elmah per effettuare il log di altre informazioni non attualmente tracciate da questo prodotto.
Alk.




Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool
Questo errore viene generato quando nel codice si apre manualmente una connessione e si dimentica di chiamare il dispose, in questo caso la connessione non viene mai tornata al pool di connessioni che piano piano si esaurisce.
Come individuarlo
Il modo più rapido è utilizzare il perfmon.exe che ha al suo interno appositi contatori dedicati al monitoraggio, li trovate sotto le categorie .NET data provider for SqlServer o .NET CLR DATA. In questo modo potete navigare e vedere quando qualche pagina non rilascia le connessioni, in questo caso infatti ci saranno pagine o operazioni che aumentano sempre il numero di connessioni nel pool. Il contatore sicuramente che amo di più è il NumberOfReclaimedConnections che indica, come dice questo articolo, quante volte una connessione è stata liberata dal garbage collector. Se ci sono leak questo valore è maggiore di zero e basta guardare quale pagina lo fa aumentare per restringere il campo di ricerca.
Per evitare questo problema è sempre bene fare i test di carico dei propri siti, questo perché il pool tiene 100 connessioni e spesso in fase di sviluppo questi errori potrebbero non essere notati se non si utilizza il perfmon, ma con un test di carico si evidenziano quasi sempre.
Utilizzate sempre Try ..finally o la clausola using per assicurarvi che le connessioni siano sempre rilasciate.
Fate inoltre molta attenzione perché non solo le connessioni ma anche tutti gli altri oggetti di accesso ai dati ed in particolar modo il datareader debbono essere chiusi o rilasciati.
Alk.
EDIT: Un buon articolo sull'argomento che ho trovato oggi è questo vale la pena leggerlo.
Alk.
Alk.
La pagina seguente ripresenta il problema, è una cosa che rende perplesso solo me? :)
Nell'esempio viene semplicemente caricata una gridView e nell'evento Init viene fatto un trace del numero di eventi presenti nella collezione controls, questo per far capire che basta accedere alla proprietà perchè il viewState non funzioni più.
Alk.
<%@ Page Language="VB"
AutoEventWireup="false"
CodeFile="my.aspx.vb"
Inherits="TestPages_my"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
>
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView2"
runat="server">
</asp:GridView>
</div>
<asp:Button ID="Button1"
runat="server"
Text="Button"
/>
</form>
</body>
</html>
<script runat="server">
Protected Sub
Page_Init(ByVal sender As
Object, ByVal e
As System.EventArgs) Handles
Me.Init
Trace.Write(GridView2.Controls.Count.ToString)
End Sub
Protected Sub
Page_Load(ByVal sender As
Object, ByVal e
As System.EventArgs) Handles
Me.Load
If Not Me.IsPostBack Then
Dim coll As New System.Collections.Generic.List(Of Integer)
coll.Add(12)
GridView2.DataSource = coll
GridView2.DataBind()
End If
End Sub
</script>
Gian Maria
Back Next






