Newsgroup: it.comp.lang.delphi
Titolo: SOAP Server e Connessione DB

Ciao a tutti,
sto realizzando un progetto in cui un SOAP Server riceve chiamate da
un interfaccia web e a fronte di queste esegue alcune operazioni su db
restituendo poi i dati al client.
Premetto che utilizzo Delphi 2006 e come DB MSSQL.
Sto testando il progetto su un windows XP in cui ho provato a mettere
il mio SOAP Server sia internamente ad IIS (sia come ISAPI dll sia
come CGI exe) ma anche come servizio di windows separato (che risponde
su una porta diversa dalla 80).
In tutti i casi a volte ho dei problemi relativi alla connessione con
il db, dico a volte perchè l'errore è sporadico, faccio il refresh
della pagina web (con relativa chiamata al servizio) e diciamo 20
volte va bene poi magari ottengo un'eccezione. Tale eccezione si ha
proprio all'apertura della connessione al db.
Intanto un consiglio: cosa sarebbe più indicato usare come provider
per agganciarsi a MSSQL? Il SQL Native Client o l'OLE DB Provider?
E poi, per aprire/chiudere il db uso questo semplice codice (che
peraltro in tante altre applicazioni non mi ha mai dato problemi):
procedure TDataMod1.OpenDB;
begin
    try
         if not ADOConnection1.Connected then
         begin
             ADOConnection1.Open;
         end;
    except
        on E:Exception do
        begin
                raise Exception.Create('Eccezione nell''apertura del
DB: '+E.Message)
        end;
    end;
end;
Nella maggior parte dei casi l'eccezione è un'orribile "Access
violation at address 01173E02 in module 'WebService.dll'. Read of
address 00000058", altrimenti anche uno strano  "L'operazione non è
consentita se l'oggetto è aperto" anche se ho controllato prima il
valore di Connected (ho provato anche controllando se
ADOConnection1.State=[ADODB.stClosed].
In seguito al primo questi errori si ripetono frequenti fino ad
arrivare anche a non avere più risposte dal Server.
Una cosa un po' particolare è che da alcuni test fatti invece su
Windows 2003 (quindi IIS 6) il tutto è molto più stabile e non ci sono
questi errori in connessione al DB.
Mi sapete dare qualche dritta su come indagare il problema?
Grazie e ciao a tutti
Matteo

Tu questo check lo fai ad ogni chiamata?
Se fai cosi, parti dal presupposto che il web service non sia
stateless...O Sbaglio?
A.

 arrivare anche a non avere piï¿œ risposte dal Server.
Ma quando fai la connessione, ad ogni richiesta??
Un server normalmente la connessione la distribuisce mediante 
meccanismo di pooling. L'importante ï¿œ che le connessioni te le crei 
all'inizio della vita del tuo server e le deallochi alla fine, 
gestendole tramite logiche di pool.
Verifica le tue conoscenze in tal senso.
-- 
Morde


Ciao,
ad ogni chiamata di metodo del SOAP server mi ricreo il datamodule e
faccio la Open del db.
In effetti il controllo me lo sono copiato da altri progetti anche nel
tentativo di evitare errori tipo "L'operazione non è
consentita se l'oggetto è aperto" o viceversa che da mia esperienza
con MSSQL e ADO capitano.
Comunque il ragionamento generale è quello stateless (se può centrare)
ciao e grazie

 faccio la Open del db.
Non va bene. Devi usare dei meccanismi di connection pooling. 
http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Ciao,
grazie per le risposte e per i consigli.
Nelle mie applicazioni finora avevo demandato allo strato ADO la
gestione del connection pooling. Da qual poco che avevo capito di
default ADO dovrebbe gestire la vera connessione fisica al db tramite
un pool da cui poi restituire la connessione che io uso internamente
al programma.
Infatti di solito creo un solo datamodule con la ADOConnection
attivata alla creazione e poi i vari datamodule delle parti del
progetto con i dataset linkati all'unica Adoconnection.
Anche in questo progetto SOAP Server avevo inizialmente tentato di
adottare una strategia simile, mettendo nel metodo di creazione della
classe di implementazione del servizio la creazione del datamodule per
la connessione. Infatti dai miei log vedevo l'iniziale apertura del db
fatta in quel metodo, ma poi solo eccezioni di Access Violation ad
ogni chiamata. Dal basso della mia scarsezza credo di aver intuito che
all'arrivo delle chiamate non fosse più correttamente inizializzata la
classe che implementa il servizio (e non so perchè...). Da ciò avevo
tolto il metodo di creazione (contenente l'apertura del db) e spostato
tutto all'interno dei metodi.
Adesso ho provato come primo passo a rifare creazione del datamodule e
open del db all'avvio, ma stavolta nell'evento OnCreate del
TWebModule.
Direi che sembra molto migliorata la cosa, per ora non mi ritrovo più
le eccezioni e analizzando con SQL Profiler di Existing Connection ne
vedo solo 2 (non so perchè non una sola...).
E' corretto intanto inserire la creazione e l'apertura alla creazione
del TWebModule? O c'è un punto più indicato?
Devo fare qualche gestione manuale del pool di connessioni olte a
quella fornita da ADO?
Grazie ancora
Ciao
Matteo

 quella fornita da ADO?
Nessuna gestione manuale.



Grazie Andrea,
ma quindi, per capire qualcosa in più, l'errore iniziale stava nel
ricreare ogni volta (ad ogni chiamata) anche il datamodule di
connessione, e quindi in questo modo giocarmi il meccanismo di
connection pool?
Altra domanda: ma il provider SQL Native Client (che viene con SQL
2005) gestisce il connection pool allo stesso modo di ADO? anche per
questo provider è abilitato di default?
Grazie ancora
Ciao
Matteo