Web Services e database MySQL

lunedì 22 settembre 2008 - 03.07

Lanello Profilo | Senior Member

Ciao,

scrivo nella sezione database questro thread perchè quello che mi crea problemi non è fare un webservice (anche se in questo campo sono novizio) ma l'utilizzo di una connessione ad un database al suo interno...

mi spiego meglio...

ho realizzato un modesto progetto nell'ambito del retail (vendita di capi di abbigliamento) per una catena di negozi...

fino a quando i negozi erano pochi, la connessione diretta da vb.net 2005 al server centrale mysql non ha dato problemi.

la versione di produzione utilizza il driver MysqlDriverCS (ottimo secondo me) per eseguire autonomamente le proprie query sql, tutto il codice è nei client, non ho utilizzato nè stored procedures, ne altri sistemi, in quanto il software doveva essere sviluppato velocemente e non dovevo combattere con problemi di sicurezza in quanto tutto il traffico dati passa in vpn a 1024 bit di criptatura.

adesso però che la catena si sta espandendo, stiamo cominciando ad incontrare i primi "rallentamenti".

urge porre rimedio, ovviamente, mi era venuto in mente per questo di creare un webservice su uno dei server aziendali che fungesse come le "vecchie" rpc (Remote Procedure Call) vale a dire, se io "sposto" le procedure che ho sui client, in questo web service, dai client non dovrò far altro che richiamare il webmethod ed attenderne il risultato, con un consumo di banda minimo.... giusto?

non sono un mago delle stored procedures, e questa è la prima volta che mi cimento nei webservices.... sto chiedendo un consiglio su quale possa essere la via meno dolorosa (come tempi di realizzazione/apprendimento)

ho provato a buttare giu qualcosa sia con le stored che con i web services, con le stored brancolo nel buio, mentre con i web services mi sono trovato arreso quando ho provato ad eseguire (per esempio per trovare le giacenze di un articolo di abbigliamento nei vari colori e taglie, nelle varie unità locali) una funzione ricorsiva del tipo

public function Giacenza(byval cod_articolo as string, byval colore as string, byval taglia as string, byval id_negozio as integer) as integer

una funzione che per esempio, per un'articolo che abbia a listino 2 colori diversi, 4 taglie e che vada visualizzata la giacenza in 10 negozi, verrebbe richiamata 2*4*10=80 volte, mi sono trovato davanti allo scoglio della connessione al database.

cosa devo fare? mi connetto al db all'interno della funzione (nell'esempio per visualizzare le giacenze di un articolo faccio 80 connessioni al db?!?!??!!?.... assurdo.... allora passo "byref" il puntatore alla connessione aperta dal client in modo tale che il webmethod utilizzi il canale già aperto dal client al momento dell'autenticazione iniziale quando il software client viene avviato..... il compilatore mi dice (giustamente) che il tipo MySQLConnection non può essere serializzato in XML....

ogni aiuto, spunto, consiglio, diffamazione o critica sarà più che ben accetto.

Grazie a tutti in anticipo.
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>urge porre rimedio, ovviamente, mi era venuto in mente per questo
>di creare un webservice su uno dei server aziendali che fungesse
>come le "vecchie" rpc (Remote Procedure Call) vale a dire, se
>io "sposto" le procedure che ho sui client, in questo web service,
>dai client non dovrò far altro che richiamare il webmethod ed
>attenderne il risultato, con un consumo di banda minimo.... giusto?

Giusto, questa è una buona idea.

>non sono un mago delle stored procedures, e questa è la prima
>volta che mi cimento nei webservices.... sto chiedendo un consiglio
>su quale possa essere la via meno dolorosa (come tempi di realizzazione/apprendimento)

Sicuramente creare un minimo di layer sul database composto quindi da Stored Procedure che operano sui dati. E uno o più web services normali o usando WCF.

>ho provato a buttare giu qualcosa sia con le stored che con i
>web services, con le stored brancolo nel buio, mentre con i web
>services mi sono trovato arreso quando ho provato ad eseguire
>(per esempio per trovare le giacenze di un articolo di abbigliamento
>nei vari colori e taglie, nelle varie unità locali) una funzione
>ricorsiva del tipo
>in 10 negozi, verrebbe richiamata 2*4*10=80 volte, mi sono trovato
>davanti allo scoglio della connessione al database.

E' proprio questo il problema se si comincia a buttare giù una applicazione senza studiarla bene poi i nodi arrivano al pettine. Magari sarebbe utile pre-calcolare le giacenze e metterle in una colonna di modo chè, invece di richiamare una funzione 80 volte, fai una select e ti restituisce un array con tutte le giacenze dei prodotti delle varie taglie e colori.

I problemi della lentezza possono essere causati da più fattori:

- Cattivo codice della applicazione Client
- Mancanza di indici sul Database o hardware del server sottodimensionato
- Link di connessione tra punti vendita e sede

Riepilogando, io farei un layer sul database fatto da stored procedures (dai non è così difficile), uno o più webservices in WCF o come preferisci e modifica delle applicazioni client in modo che sfruttino i web services.

Naturalmente essendo applicazioni remote e non essendo le sedi collegate in fibra ottica un po' di latenza c'è sempre.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member


>Riepilogando, io farei un layer sul database fatto da stored
>procedures (dai non è così difficile), uno o più webservices
>in WCF o come preferisci e modifica delle applicazioni client
>in modo che sfruttino i web services.

sto già studiando un po le stored, però non capisco come serializzare i dati

il problema delle giacenze è un esempio con il quale volevo far capire qual'è il mio reale problema (sto già utilizzando la colonna che vado ad aggiornare, il software è in produzione da quasi 2 anni e fino ad ora che i punti vendita erano un numero ridotto andava tutto bene anche con la struttura diretta client/db server), il fatto cioè che vorrei sapere se è possibile utilizzare con gli webservice una connessione persistente in modo da eseguire il codice senza i tempi di autenticazione.

grazie per gli spunti che intanto mi hai dato.

ps: struttura del db, indici e dimesionamento dei server mi sembra ottimale.
-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Brainkiller Profilo | Guru

>sto già studiando un po le stored, però non capisco come serializzare
>i dati

Questo lo devi decidere tu. In parte ti aiuta il Web Service che può anche serializzare strutture complesse come DataSet, XMLDocument, ecc.

>il fatto cioè che vorrei sapere se è possibile utilizzare con
>gli webservice una connessione persistente in modo da eseguire
>il codice senza i tempi di autenticazione.

Allora penso saprai, la chiamata a un Web Service è coma una GET/POST di una pagina Web. Quindi i tempi sono quelli. Riguardo l'autenticazione nel caso del Web Service se sono posizionati sullo stesso server su cui c'è anche MySQL l'autenticazione avviene in locale ma .NET apre un pool di connessioni ri-utilizzabili quindi in questo caso non c'è overhead aggiuntivo e anche se sono elevate non dovrebbero esserci problemi.

Seguendo questo caso, dovrai tenere presente che all'interno del WebService magari userai una connessione unica al database da cui recupererai tutti i dati necessari poi una volta uniformati li rimandi al client di ritorno.

>grazie per gli spunti che intanto mi hai dato.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Lanello Profilo | Senior Member


>Allora penso saprai, la chiamata a un Web Service è coma una
>GET/POST di una pagina Web. Quindi i tempi sono quelli.

lo so bene, ma i tempi del GET/POST sarebbero comunque inferiori del passaggio via socket del dataset intero che adesso la versione di produzione sta utilizzando per accedere ai dati.

>Riguardo l'autenticazione nel caso del Web Service se sono posizionati
>sullo stesso server su cui c'è anche MySQL l'autenticazione avviene
>in locale ma .NET apre un pool di connessioni ri-utilizzabili
>quindi in questo caso non c'è overhead aggiuntivo e anche se
>sono elevate non dovrebbero esserci problemi.
...
>Seguendo questo caso, dovrai tenere presente che all'interno
>del WebService magari userai una connessione unica al database
>da cui recupererai tutti i dati necessari poi una volta uniformati
>li rimandi al client di ritorno.

Sai farmi qualche esempio per riutilizzare sempre la stessa connessione perchè ho fatto un oggetto public nel webservice che è l'istanza della mia connessione, ma (facendo un if nei vari webmethod vado a vedere se la connessione è aperta, altrimenti la riapro) mi trovo a vedere dalla console di amministrazione il numero di connessioni al database che aumentano ad ogni chiamata ad un webservice (ho fatto una applicazione di test per far prove di stress sui server di test), fino al raggiungimento del numero massimo consentito.

Scusami magari sarà banale, ma non avendo mai lavorato con questi strumenti ed essendo abituato allo sviluppo di applicazioni Windows Form non sono abituato allo sviluppo con tecnologie web.

Grazie ancora.

-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.

Lanello Profilo | Senior Member

grazie brainkiller mi hai salvato!

x gli altri... leggete il continuo a questo indirizzo

http://www.dotnethell.it/forum/messages.aspx?ThreadID=25561


-----------------------------------------------------
La ricompensa per una cosa ben fatta, è averla fatta.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5