Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    25

    vb.net lentissimo in una rete lan

    ciao a tutti!!!
    mi scuso se quello che scriverò e OT o se è stato già trattato, ho usato cerca, ma non ho trovato soluzioni accettabili.

    ho creato un'applicazione vb.net che si interfaccia con un Db MySql driver ODBC. Fin quando testavo l'applicazione in locale tutto ok. Quando ho installato il programma nell'infrastruttura di destinazione ho avuto una spiacevole sorpresa.
    Le query risultano lente.(dell'ordine anche di qualche minuto.)
    L'infrastruttura è la seguente(da quanto mi racconta l'amministratore di rete, non l'ho fatta io):
    -Un server Linux(Debian) sul quale è installato MySql in ascolto su porta 3360.
    -9 pc con WinXp collegati al server mediante Lan.
    -l'amministratore mi ha assicurato che non c'è nessun analizzatore di traffico o firewall all'interno della LAN o altro meccanismo di sicurezza.
    ora prima di ottimizzare il codice tentando di eseguire query in maniera asincrona, troncando il resulset in più frammenti e altro...vorrei capire se è possibile apportare delle modifiche alla rete che mi facciano aumentare le prestazioni.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Se il problema riguarda una ottimizzazione della rete LAN, non ha senso postare qui, visto che ci occupiamo nello specifico di problemi di programmazione, non di architetture di rete.

    Se invece il problema riguarda lo sviluppo, allora è un altro discorso.

    Eventualmente, fai sapere qual è la materia del contendere chiarendo il dubbio sopra, così posso capire dove è meglio spostarti per trattare il tuo problema.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    25
    ecco!!! in locale va velocissimo e non ho problemi...il problema è in lan da remoto...ora non sapendo se i problemi dipendono dalla LAN non posso ne escludere che il problema sia di network o di ottimizzazione della gestione delle connessioni, quindi di programmazione.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da incapato
    ecco!!! in locale va velocissimo e non ho problemi...il problema è in lan da remoto...ora non sapendo se i problemi dipendono dalla LAN non posso ne escludere che il problema sia di network o di ottimizzazione della gestione delle connessioni, quindi di programmazione.
    Noi non abbiamo alcun dettaglio né della tua applicazione né della LAN, quindi non possiamo dire nulla in proposito senza ulteriori informazioni.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    25
    avete ragione:
    si tratta di un'applicazione vb.net che esegue delle query ad un db MySql (odbc driver).
    al Load di un form che visualizza un'anagrafica viene effettuata una query di select che carica 3.000 nomi, più o meno, in un data grid view. l dati non sono visualizzati tutti insieme ma a pagine. il server è un server Linux(debian) si trova in una rete con 9 pc con Xp(S.O.) la velocità della lan è 100 Mbit/s, non ci sono firewall a quanto mi dicono. Tutte le operazioni in fase di sviluppo venivano eseguite in locale ed erano abbastanza veloci. Passando dal locale al remoto via LAN le prestazioni sono peggiorate.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da incapato
    si tratta di un'applicazione vb.net che esegue delle query ad un db MySql (odbc driver). [...]
    Tutte queste cose ce le hai già dette, ma non hai detto con quali classi vengono caricati i dati.

    Ad ogni modo, penso si possa fare alcune considerazioni generali che dovrai verificare personalmente, e cioè
    • verificare qual è la velocità effettiva di trasferimento dati in LAN;
    • se non ci sono problemi in LAN, verifica qual è la quantità effettiva di dati che trasmetti sul cavo (migliaia di record composte da stringhe e testi lunghi possono richiedere tempo);
    • controllare che non vi siano interrogazioni aggiuntive per ciascun record che scarichi, ricontattando continuamente il server.


    Ripeto: tralasciando le specifiche che hai fornito, senza sapere cosa fa nel particolare la tua applicazione, e come lo fa, è impossibile dire altro.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    25
    ho creato una sola classe di connessione, che utilizzo per tutte le connessioni, ogni volta richiamo i metodi open close esegui query che ho creato.

    l'operazione di select è associata al Load del form che contiene i dati da visualizzare.

    memorizzo, successivamente, il risultato della query di select in un Recordset e lo scorro per visualizzare i dati.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da incapato
    l'operazione di select è associata al Load del form che contiene i dati da visualizzare.

    memorizzo, successivamente, il risultato della query di select in un Recordset e lo scorro per visualizzare i dati.
    Posta parte del codice sorgente con cui fai la lettura come esempio.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    25
    Private Sub visualizza()

    If rs.BOF = True Then

    Button10.Hide()
    MsgBox("sei arrivato al primo nome dell'archivio, puoi solo scorrere in avanti o usare la funzione: ''vai al primo''; ''vai alla fine'' ")
    Else
    Button10.Visible = True





    If rs.RecordCount = 0 Then
    MsgBox("il database è vuoto carica i nominativi", MsgBoxStyle.Information)
    Else
    If rs.EOF = False Then
    txtMatricola.Text = CStr(rs.Fields!matricola())

    If rs.Fields("cod_iscritto").Value Is DBNull.Value Then
    txtcodiscritto.Text = ""
    Else
    txtcodiscritto.Text = CStr(rs.Fields!cod_iscritto())
    End If
    If rs.Fields("Cognome").Value Is DBNull.Value Then
    TxtCognome.Text = ""
    Else
    TxtCognome.Text = rs.Fields!Cognome()
    End If
    If rs.Fields("nome").Value Is DBNull.Value Then
    TxtNome.Text = ""
    Else
    TxtNome.Text = rs.Fields!nome()
    End If
    If rs.Fields("luogonascita").Value Is DBNull.Value Then
    TxtNatoa.Text = ""
    Else
    TxtNatoa.Text = rs.Fields!luogonascita()
    End If
    If rs.Fields("Provnat").Value Is DBNull.Value Then
    Txtprov2.Text = ""
    Else
    Txtprov2.Text = rs.Fields!Provnat()
    End If
    If rs.Fields("Datanascita").Value Is DBNull.Value Then
    MaskedTextBox2.Text = "00/00/0000"
    Else
    MaskedTextBox2.Text = CStr(rs.Fields!Datanascita())
    End If
    If rs.Fields("Codfis").Value Is DBNull.Value Then
    Txtcodicefiscale.Text = ""
    Else
    Txtcodicefiscale.Text = rs.Fields!Codfis()
    End If
    If rs.Fields("Indirizzo").Value Is DBNull.Value Then
    Txtindirizzo.Text = ""
    Else
    Txtindirizzo.Text = rs.Fields!Indirizzo()
    End If
    If rs.Fields("Cap").Value Is DBNull.Value Then
    Txtcap.Text = ""
    Else
    Txtcap.Text = rs.Fields!Cap()
    End If
    If rs.Fields("Citta").Value Is DBNull.Value Then
    Txtcitta.Text = ""
    Else
    Txtcitta.Text = rs.Fields!Citta()
    End If
    If rs.Fields("Prov").Value Is DBNull.Value Then
    Txtprov2.Text = ""
    Else
    Txtprov2.Text = rs.Fields!Prov()
    End If
    If rs.Fields("Telefono").Value Is DBNull.Value Then
    Txttelefono.Text = ""
    Else
    Txttelefono.Text = rs.Fields!Telefono()
    End If
    If rs.Fields("Cellulare").Value Is DBNull.Value Then
    Txtcellulare.Text = ""
    Else
    Txtcellulare.Text = rs.Fields!Cellulare()
    End If
    If rs.Fields("StudioPratica").Value Is DBNull.Value Then
    Txtpratica.Text = ""
    Else
    Txtpratica.Text = rs.Fields!StudioPratica()
    End If
    If rs.Fields("Data_Laurea").Value Is DBNull.Value Then
    MaskedTextBox3.Text = "00/00/0000"
    Else
    MaskedTextBox3.Text = CStr(rs.Fields!Data_Laurea())
    End If
    If rs.Fields("Luogo_Laurea").Value Is DBNull.Value Then
    Txtuniversita.Text = ""
    Else
    Txtuniversita.Text = rs.Fields!Luogo_Laurea()
    End If
    If rs.Fields("Iscrizione_praticanti").Value Is DBNull.Value Then
    MaskedTextBox4.Text = "00/00/0000"
    Else
    MaskedTextBox4.Text = CStr(rs.Fields!Iscrizione_praticanti())
    End If
    If rs.Fields("Abilitazione_patrocinio").Value Is DBNull.Value Then
    MaskedTextBox6.Text = "00/00/0000"
    Else
    MaskedTextBox6.Text = CStr(rs.Fields!Abilitazione_Patrocinio())
    End If
    If rs.Fields("Giuramento").Value Is DBNull.Value Then
    MaskedTextBox5.Text = "00/00/0000"
    Else
    MaskedTextBox5.Text = CStr(rs.Fields!Giuramento())
    End If
    If rs.Fields("Compiuta_pratica").Value Is DBNull.Value Then
    MaskedTextBox7.Text = "00/00/0000"
    Else
    MaskedTextBox7.Text = CStr(rs.Fields!Compiuta_pratica())
    End If
    If rs.Fields("Data_Trasferimento").Value Is DBNull.Value Then
    Txtdatatrasferimento.Text = ""
    Else
    Txtdatatrasferimento.Text = CStr(rs.Fields!Data_Trasferimento())
    End If
    If rs.Fields("Albo_provenienza").Value Is DBNull.Value Then
    Txtdatatrasferimento.Text = ""
    Else
    Txtdatatrasferimento.Text = CStr(rs.Fields!Albo_provenienza())
    End If
    If rs.Fields("Iscrizione_cassa_previdenza").Value Is DBNull.Value Then
    MaskedTextBox14.Text = "00/00/0000"
    Else
    MaskedTextBox14.Text = CStr(rs.Fields!Iscrizione_cassa_previdenza())
    End If
    If rs.Fields("Pensionamento").Value Is DBNull.Value Then
    MaskedTextBox15.Text = "00/00/0000"
    Else
    MaskedTextBox15.Text = CStr(rs.Fields!Pensionamento())
    End If
    If rs.Fields("Cancellazione").Value Is DBNull.Value Then
    MaskedTextBox17.Text = "00/00/0000"
    Else
    MaskedTextBox17.Text = CStr(rs.Fields!Cancellazione())
    End If
    If rs.Fields("Motivazione").Value Is DBNull.Value Then
    TxtMotivazione.Text = ""
    Else
    TxtMotivazione.Text = rs.Fields!Motivazione()
    End If
    If rs.Fields("mandamento").Value Is DBNull.Value Then
    Txtmandamento.Text = ""
    Else
    Txtmandamento.Text = rs.Fields!mandamento()
    End If

    If rs.Fields("motivazioni_cassa").Value Is DBNull.Value Then
    TxtMotivazione.Text = ""
    Else
    TxtMotivazione.Text = rs.Fields!motivazioni_cassa()
    End If
    If rs.Fields("Cancellazione_cassa").Value Is DBNull.Value Then
    MaskedTextBox17.Text = "00/00/0000"
    Else
    MaskedTextBox17.Text = CStr(rs.Fields!Cancellazione_cassa())
    End If
    If rs.Fields("Note").Value Is DBNull.Value Then
    TxtNoteGenerali.Text = ""
    Else
    TxtNoteGenerali.Text = rs.Fields!Note()
    End If
    ' ricorda che lo devi cambiare quando fai cassa
    If rs.Fields("ultimo_anno_pagato").Value Is DBNull.Value Then
    TxtUtimoAnno.Text = ""
    Else
    TxtUtimoAnno.Text = CStr(rs.Fields!ultimo_anno_pagato())
    End If
    If rs.Fields("num_contr").Value Is DBNull.Value Then
    TxtCodiceContribuente.Text = ""
    Else
    TxtCodiceContribuente.Text = CStr(rs.Fields!num_contr())
    End If
    If rs.Fields("sesso").Value Is DBNull.Value Then
    ComboBox1.Text = ""
    Else
    ComboBox1.Text = rs.Fields!sesso()
    End If
    If rs.Fields("cod_com_prec").Value Is DBNull.Value Then
    TxtComunePrecedente.Text = ""
    Else
    TxtComunePrecedente.Text = CStr(rs.Fields!cod_com_prec())
    End If
    If rs.Fields("TESTO").Value Is DBNull.Value Then
    TxtNoteGenerali.Text = ""
    Else
    TxtNoteGenerali.Text = rs.Fields!TESTO()
    End If
    If rs.Fields("email").Value Is DBNull.Value Then
    Txtemail.Text = ""
    Else
    Txtemail.Text = rs.Fields!email()
    End If
    If rs.Fields("matricola_laurea").Value Is DBNull.Value Then
    Txtmatrlaurea.Text = ""
    Else
    Txtmatrlaurea.Text = CStr(rs.Fields!matricola_laurea())
    End If
    If rs.Fields("ntessera").Value Is DBNull.Value Then
    TxtTessera.Text = ""
    Else
    TxtTessera.Text = CStr(rs.Fields!ntessera())
    End If
    If rs.Fields("DataTessera").Value Is DBNull.Value Then
    MaskedTextBox1.Text = "00/00/0000"
    Else
    MaskedTextBox1.Text = CStr(rs.Fields!datatessera())
    End If
    If rs.Fields("duplicato").Value Is DBNull.Value Then
    CheckBox1.Checked = False
    Else
    CheckBox1.Checked = True
    End If
    If rs.Fields("primoanno").Value Is DBNull.Value Then
    CheckBox2.Checked = False
    Else
    CheckBox2.Checked = True
    End If
    If rs.Fields("secondoanno").Value Is DBNull.Value Then
    CheckBox3.Checked = False
    Else
    CheckBox3.Checked = True
    End If
    If rs.Fields("terzoanno").Value Is DBNull.Value Then
    CheckBox4.Checked = False
    Else
    CheckBox4.Checked = True
    End If





    End If
    End If

    End Sub


    classe di connessione
    Imports System.Data.OleDb
    Imports System.IO
    Public Class Connection
    Dim cn As ADODB.Connection


    Public Function open_connection()

    Dim ipdatabase As String = "127.0.0.1"
    Dim pswdatabase As String = "" ' password database
    Dim iddatabase As String = "root" ' username database
    Dim nomedatabase As String = "archivio" 'nome database
    cn = New ADODB.Connection
    cn.Open("DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & ipdatabase & ";DATABASE=" & nomedatabase & ";UID=" & iddatabase & ";PASSWORD=" & pswdatabase & ";OPTION=1″")

    End Function

    Public Function esegui_query(ByVal sql As String, ByVal i As Integer, Optional ByVal j As Integer = 3)
    Dim rs As ADODB.Recordset
    rs = New ADODB.Recordset
    If i = 3 Then
    rs.Open(sql, cn, i, j)
    Else
    rs.Open(sql, cn, i)
    End If
    Return rs
    End Function

    Public Function calcellazione(ByVal sql As String)
    cn.Execute(sql)
    End Function


    Public Function conn_close()
    cn.Close()
    End Function





    End Class

    lafunction visualizza viene invocata dall'evento load


    hp dpvuto troncare un po di codice perchè superavo il limite dei caratteri....
    il resulset viene impostato prima della chiamata a funzione è una variabile globale

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Secondo me, buona parte dei problemi di performance risiede anche nel fatto che hai usato un driver ODBC, quindi un driver tendenzialmente legacy (per meglio dire "vecchio"), e più lento rispetto al driver OLE DB.

    Considerando le modalità con cui apri la connessione, fornendo la possibilità di navigare nel RecordSet rimanendo connesso al database, anche questo contribuisce probabilmente a ridurre le performance in generale.

    Perché usare quelle classi al posto di un driver OLE DB aggiornato e delle classi appositamente dedicate?

    Perché non viene usato un DataSet per poter scaricare i dati con cui l'utente può lavorare, disimpegnando il server, e gestire l'aggiornamento del database utilizzando il DataAdapter?

    A mio avviso, sono questi i fattori che comportano uno scambio di dati necessario con il server, poco incidente quando si tratta della stessa macchina ma lesivo quando i dati viaggiano in rete.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.