Avatar billede ossian Nybegynder
11. juli 2006 - 00:48 Der er 10 kommentarer og
2 løsninger

Hjælp til optimering af kode. Den maxer CPU'en på min server

Hejsa,

Jeg har brug for lidt hjælp til denne kode. Det er tilsyneladende den der maxer CPU'en på min server:


Partial Class starnews
    Inherits System.Web.UI.Page

    Public Function countImages(ByVal strUniqueKey As String)
        Dim mySqlConn5 As New MySqlConnection("Database=imagecrack;Data Source=localhost;User Id=root;Password=x")
        mySqlConn5.Open()

        Dim cmd As MySqlCommand = New MySqlCommand("SELECT COUNT(*) AS records FROM images WHERE unique_key = '" & strUniqueKey & "'", mySqlConn5)
        'cmd.ExecuteNonQuery()

        Dim reader As MySqlDataReader = cmd.ExecuteReader
        reader.Read()

        Return "<span style=margin-left:3px;>" & reader("records") & " images</span>"
        reader.Close()
        mySqlConn5.Close()
        mySqlConn5.Dispose()

    End Function

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Master.Page.Header.Title = "celebz.info"

        Dim strStarID As String = Request("id")
        Dim mySqlConn As New MySqlConnection("Database=celebz;Data Source=localhost;User Id=root;Password=x;  pooling=false;")
        mySqlConn.Open()

        Dim cmd As MySqlCommand = New MySqlCommand("SELECT COUNT(*) AS records FROM posts WHERE star_id = '" & strStarID & "'", mySqlConn)
        'cmd.ExecuteNonQuery()

        Dim reader As MySqlDataReader = cmd.ExecuteReader
        If reader.Read() Then
            Dim intRecords As Integer = reader("records")
            Dim intPage As Integer = Request("page")
            If Request("page") = "" Then
                intPage = 1
            Else
                intPage = intPage
            End If
            Dim intPageSize As Integer = 16
            Dim intStart As Integer = intPage * intPageSize
            intStart = intStart - intPageSize
            Dim intPages As Integer = intRecords / intPageSize



            Dim mySqlConn2 As New MySqlConnection("Database=celebz;Data Source=localhost;User Id=root;Password=x;  pooling=false;")
            mySqlConn2.Open()
            Dim cmd2 As MySqlCommand = New MySqlCommand("SELECT * FROM posts WHERE star_id = '" & strStarID & "' ORDER BY post_id DESC LIMIT " & intStart & ", " & intPageSize & "", mySqlConn2)
            Dim reader2 As MySqlDataReader = cmd2.ExecuteReader
            mainLabel.Text = "<div id=""container_div"" style=""width:560px; position:relative; padding-left:10px;"" align=""left"" >"

            While reader2.Read()
                Dim strCreated = reader2("created")


                mainLabel.Text &= "<span class=header_span><h3><a href=""post.aspx?id=" & reader2("post_id") & """>" & reader2("header") & "</a></h3></span>" & strCreated.ToLongDateString() & "<br />" & reader2("content") & "<br />"
                Dim strImageCrackUniqueKey As String = reader2("imagecrack_unique_key")
                If strImageCrackUniqueKey = "0" Then
                    mainLabel.Text &= ""
                Else
                    strImageCrackUniqueKey = reader2("imagecrack_unique_key")

                    Dim mySqlConn3 As New MySqlConnection("Database=imagecrack;Data Source=localhost;User Id=root;Password=x;  pooling=false;")
                    mySqlConn3.Open()
                    Dim cmd3 As MySqlCommand = New MySqlCommand("SELECT * FROM images WHERE unique_key = '" & strImageCrackUniqueKey & "' ORDER BY image_id ASC LIMIT 0,3", mySqlConn3)
                    Dim reader3 As MySqlDataReader = cmd3.ExecuteReader

                    mainLabel.Text &= "<div id=""images_div"">"

                    While reader3.Read
                        mainLabel.Text &= "<a href=""image.aspx?i=" & reader3("title") & "&s=" & reader3("short_key") & """><img class=img src=""http://www.imagecrack.com/publicimages/tn_" & reader3("image_filename") & """></a>"

                    End While

                    mainLabel.Text &= "<br /><a href=""post.aspx?id=" & reader2("post_id") & """ > " & countImages(reader3("unique_key")) & "</a></div><hr />"
                    reader3.Close()
                    mySqlConn3.Close()
                    mySqlConn3.Dispose()
                End If

            End While


            Dim i As Integer
            labelPaging.Text = "<div id=""pager_div""><span class=""paging"">"
            For i = 1 To intPages


                labelPaging.Text &= "<a href=?page=" & i & ">" & i & "</a>"

            Next

            labelPaging.Text &= "</span></div>"
            mainLabel.Text &= "</div>"
            reader.Close()
            reader2.Close()

            mySqlConn.Close()
            mySqlConn.Dispose()
            mySqlConn2.Close()
            mySqlConn2.Dispose()
        End If
    End Sub

End Class
Avatar billede arne_v Ekspert
11. juli 2006 - 01:18 #1
du kunne ihvertfald prøve at erstatte streng akkumuleringen med &= med
StringBuilder og Append
Avatar billede arne_v Ekspert
11. juli 2006 - 01:18 #2
hvis MySQL kører på samme server så skal du checke om det MySQL eller ASP.NET
som bruger CPU

hvis det er MySQL så skal du nok igang med at checke nogle indexes
Avatar billede neoman Novice
11. juli 2006 - 10:32 #3
Nu ved jeg ikke hvad dimensionerne er på dine lister/tabeller, men der synes at være ret mange open/close af connections, og tillige har du sat "pooling"=false. Det er givetvis ikke helt ressourcefrit at åbne/lukke på den måde.

Er der noget i vejen for at holde open/close udenfor dine loops og countImages funktionen?

I øvrigt, hvis du blot skal have fat i en COUNT fra en tabel, hvad med at køre en SqlCommand.ExecuteScalar, som returnerer værdien uden at man skal have fat i en hel Reader  i din countImages function ?
Avatar billede ossian Nybegynder
11. juli 2006 - 22:09 #4
Hejsa,

Tak for jeres svar..  Jeg har et enkelt spørgsmål; Hvordan ser jeg om det er ASP.Net der bruger cpu'en? mySQL kører fint ifølge mySQL Administrator..

Endnu en gang tak.. jeg prøver at implementere de tips I har givet og ser om det giver et positivt resultat..
Avatar billede ossian Nybegynder
11. juli 2006 - 22:11 #5
Neoman> Kan du hjælpe mig med at lave denne her funktion om til mySQLCommand.ExecuteScalar??

Public Function countImages(ByVal strUniqueKey As String)
        Dim mySqlConn5 As New MySqlConnection("Database=imagecrack;Data Source=localhost;User Id=root;Password=x")
        mySqlConn5.Open()

        Dim cmd As MySqlCommand = New MySqlCommand("SELECT COUNT(*) AS records FROM images WHERE unique_key = '" & strUniqueKey & "'", mySqlConn5)
        'cmd.ExecuteNonQuery()

        Dim reader As MySqlDataReader = cmd.ExecuteReader
        reader.Read()

        Return "<span style=margin-left:3px;>" & reader("records") & " images</span>"
        reader.Close()
        mySqlConn5.Close()
        mySqlConn5.Dispose()

    End Function
Avatar billede arne_v Ekspert
11. juli 2006 - 22:13 #6
task manager
Avatar billede arne_v Ekspert
11. juli 2006 - 22:15 #7
jeg haaber at det er OK at jeg svarer paa funktionen:

Public Function countImages(ByVal strUniqueKey As String)
        Dim mySqlConn5 As New MySqlConnection("Database=imagecrack;Data Source=localhost;User Id=root;Password=x")
        mySqlConn5.Open()

        Dim cmd As MySqlCommand = New MySqlCommand("SELECT COUNT(*) AS records FROM images WHERE unique_key = '" & strUniqueKey & "'", mySqlConn5)

        Return "<span style=margin-left:3px;>" & cmd.ExecuteScalar & " images</span>"

        mySqlConn5.Close()
        mySqlConn5.Dispose()

    End Function
Avatar billede arne_v Ekspert
11. juli 2006 - 22:16 #8
ExecuteScalar er ioevrigt kun visuelt - den laver selv en data reader internt
Avatar billede neoman Novice
12. juli 2006 - 10:49 #9
tak til arne_v for at du skrev koden. Og det der med "visuel" ExecuteScalar - tak for det, det vidste jeg ikke, men egentligt burde jeg ha regnet det ud selv, :-).

ossian : har du overvejet at relokere open/close til udenfor alle dine loops ?
Avatar billede ossian Nybegynder
12. juli 2006 - 11:09 #10
D'herrer> Smid et svar.. min CPU kører normalt igen :-)

Og Neoman, ja jeg er i gang med at fjerne mine connections fra mine loops - kan godt se at det ikke er så smart :)

Tusinde tak for hjælpen til jer begge to!
Avatar billede neoman Novice
12. juli 2006 - 20:23 #11
Her kommer ½-svar:-)
Avatar billede arne_v Ekspert
12. juli 2006 - 20:27 #12
ditto
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester