Newsgroup: it.comp.lang.delphi
Titolo: Condividere connessione a database tra piu' DLL

Salve, mi trovo a dover risolvere una situazione un po' spinosa... Dovrei
relalizzare una serie di DLL che consentano di effettuare alcune operazioni
su un database (sono DLL ISAPI, usate per un server web). Il problema che mi
trovo a dover affrontare riguarda la connessione al database: se un utente
si connette e richiama (per esempio) cinque funzioni residenti in DLL
diverse (ce ne sono svariate, purtroppo devono essere tutte separate), mi
trovo a dover inizializzare una connessione al database per ciascuna di
esse, con conseguente calo di prestazioni ed eventuale crash del server (si
parla di connessione di decine di utenti).
Il mio dubbio riguarda la modalita' da seguire per collegarsi correttamente
al server in casi come questo.
Come devo procedere per evitare decine di connessioni? Condividerne una tra
piu' DLL non mi pare sia possibile, o almeno non so come si fa :)
Sapreste gentilmente indicarmi qualche sito che dia dei suggerimenti, o
qualche documento, o qualche "howto"? Ho gia' cercato su Delphi3000.com, ma
non sono riuscito a trovare nulla di interessante...
Vi ringrazio moltissimo per l'aiuto :)
Daigo

 piu' DLL non mi pare sia possibile, o almeno non so come si fa :)
con Java viene costruito un servlet che gestisce un pool di connessioni,
penso la strada sia questa, pero' per i dettagli non saprei dirti; forse
avere un processo sempre attivo al quale le dll possono richiedere una
connessione libera ?

 piu' DLL non mi pare sia possibile, o almeno non so come si fa :)
Che tipo di accesso ai dati stai utilizzando ? a quale RDBMS ti colleghi ?
Il principio base e' che dovresti passare alla DLL (invocando una sua
funzione) un puntatore all'"oggetto connessione" che hai nell'applicazione
principale e usare questo nelle funzioni della DLL.
Essendo le DLL mappate nello stesso spazio di indirizzamento del processo,
questo e' fattibile senza problemi.
Tutto dipende, pero', come gia' detto sopra, dal modo di accesso ai dati che
usi.
--------------------------------
Inviato via 
http://usenet.libero.it

 principale e usare questo nelle funzioni della DLL.
Ho provato, ma non funziona. O meglio, funziona in un senso, ma non
nell'altro... :)
Ti lascio due esempi:
// Questa funzione DOVREBBE passare a una DLL la connessione da utilizzare.
Non funzia...
function Prova: Integer;
var
  P: PADOConnection; // PADOConnection = ^TADOConnection
begin
    P := Addr(ADOConnection); // ADOConnection e' un oggetto TADOConnection
gia' attivo
    Result := Test(P); // "Test" e' in una DLL, vorrei passare la
connessione
end;
// Prova2 funziona esattamente al contrario. Risiede nella DLL e RESTITUISCE
un puntatore
// a una connessione. Questa funziona, ma a me serve l'altra :)
function Prova2: PADOConnection;
begin
    Result := Addr(ADOConnection);
end;
Di sicuro sbaglio qualcosa, ma non so cosa... Tra l'altro, ogni tanto,
quando cerco di creare la TADOConnection, mi salta fuori l'errore
"EOLESysError: CoInitialize non e' stato chiamato". Ma lo fa solo ogni
tanto... Boh?
Grazie per gli aiuti
Daigo

 "EOLESysError: CoInitialize non e' stato chiamato". Ma lo fa solo ogni
CoInitialize(0) va chiamato in ogni thread che fa uso di ADO.


 con Java viene costruito un servlet che gestisce un pool di connessioni,
Il "connection pooling" esiste anche con ADO.
Dipende strettamente dall'OLE DB utilizzato, anche se quelli per i RDBMS
piu' conosciuti lo supportano tutti, pero' la c.p. non serve ad ottimizzare
il numero di risorse, quanto ad incrementare le performance. Si tratta,
cioe', di riutilizzare le connessioni chiuse, che rimangono in un pool sino
alla scadenza di un certo tempo.



Quindi nella "initialization", vero?
Grazie mille, ho pressoche' risolto tutto
Daigo