Newsgroup: it.comp.lang.visual-basic
Titolo: MTS

Ho realizzato un'applicazione distribuita utilizzando componenti MTS.
Una volta creato il pacchetto su MTS locale e provato, ho notato
rallentamenti spaventosi di prestazioni, diciamo inaccettabili, del tipo 2
minuti per caricare una combo da un tabella di 1000 righe quando durante lo
sviluppo ci metteva 2/3 secondi.
Come mai?
M.

Qualcuno sa sviluppare applicazioni distribuite ed e' in grado di darmi
qualche botta e risposta per risolvere un problema che mi assila da ore...?
Vi ringrazio.
Massimo

 wrote in message
news:8p7cns$8ei$1...@news.flashnet.it...


Problema con MTS
Ho creato delle DLL con le seguenti proprietà:
- MTSTransactionMode : UseTransaction
- Instancing: MultiUse
Ho importato le DLL all'interno di MTS su WINDOWS NT 4.0 creando
- prima un nuovo packege;
- importando le dll con new component
Ho esportato il pacchetto su un client WINDOWS 98.
Quando faccio partire l'applicazione, viene accettata la dichiarazione della
classe:
- Dim objCliente as Cliente.classCliente
tanto è che vedo il componente "girare" all'interno di MTS sul server NT.
Nel momento in cui però, faccio riferimento ad una funzione interna della
class, mi viene dato errore, cioè quando faccio:
- objCliente.GetCliente
mi viene dato l'errore 70 Permission Denied.
Cercando nell'MSDN dicono di provare 2 soluzioni:
1. disabilitare tutti i chak box "Enable autorization chaking"
2. creare una Role abilitando gli utenti che accedono autenticati da Windows
NT.
Entrambe le soluzioni provate danno esito negativo.
Allora ho provato ad installare nell'MTS locale di Win98 i compnenti.
L'accesso ovviamente è consentito, solamente che viene generato un errore di
questo tipo:
[Microsoft] [ODBC SQL Server Driver] [SQLServer] Distributed transaction
comleted. Either enlist this session in a new transaction or the null
transaction.
quando effettuo le seguenti operazioni:
Nella sub form_load:
- Imposto come variabile di modulo rstOperatori
- Set rstOperatori = objOperatori.GetListaOperatori("ODBCProva", "Prova",
"Prova")
- la funzione GetListaOperatori restituisce un recordset
- quando accedo al RecordSet in qualsiasi modo tutto funziona
Il rstOperatori dovrebbe essere aperto, e nell'evento OK di un
commandbutton, eseguo la seguente funzione:
- rstOperatori.movefirst
a questo punto viene generato l'errore sopra descritto.
All'interno della funzione GetListaOperatori istanzio ogni volta l'
OBJCONTEXT come da manuale Microsoft dell'esame 70-175.
Allora ho fatto un'altra prova. Ho copiato l'eseguibile direttamente sul
server, e le chiamate vanno tutte a buon fine.
L'unico problema e' che le prestazioni sono lentissime. Per caricare un
recordset di 1000 elementi con nome, cognome, partitiva e telefono ci met

Public Function GetListaRivenditori(DSN As String, UserName As String,
Password As String) As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim Conn As ADODB.Connection
    Dim objContext As MTxAS.ObjectContext
On Error GoTo ErrorHandler
    MsgBox "Istanzio l'objcontext."
    Set objContext = MTxAS.GetObjectContext
'***************************************************************************
*******
    '* Se non viene istanziato l'OBJContext, significa che l'oggetto non
viene eseguito
    '* in MTS
'***************************************************************************
*******
    If objContext Is Nothing Then
        Set Conn = New ADODB.Connection
        Set cmd = New ADODB.Command
    Else
        Set Conn = objContext.CreateInstance("ADODB.Connection")
        Set cmd = objContext.CreateInstance("ADODB.Command")
    End If
    Conn.Open DSN, UserName, Password
    '* Eseguo la Stored Procedure per la restituzione della lista degli
operatori
    With cmd
        .ActiveConnection = Conn
        .CommandType = adCmdStoredProc
        .CommandText = "GetRivenditori"
        MsgBox "Chiamo execute."
        Set GetListaRivenditori = .Execute
    End With
    '***************************************
    '* La scansione č andata a buon fine
    '***************************************
    'Conn.Close
    Set Conn = Nothing
    If Not objContext Is Nothing Then
        MsgBox "Chiamo complete."
        objContext.SetComplete
    End If
Exit_Function:
    Exit Function
ErrorHandler:
    '***************************************
    '* Si sono verificati degli errori
    '***************************************
    If Not objContext Is Nothing Then
        objContext.SetAbort
    End If
    Resume Exit_Function
End Function
Questa e' una delle funzioni che chiamo. Le altre sono tutte uguali.

     '* La scansione è andata a buon fine


Per *Alessandro*:
Ciao, grazie per la tua risposta.
Non riesco ad accedere ai componenti remoti:
Ho fatto questo:
- lancio DCOMCNFG sul server
- Seleziono il componente:
- CUSTOM ACCES PERMISSIONS:
 . Everyone - allow access
 . System - allow access
 . Interactive - allow access
- CUSTOM LAUNCH PERMISSIONS:
 . Everyone - allow launch
 . System - allow launch
 . Interactive - allow launch
- CUSTOM CONFIGURATION PERMISSION
 . CREATOR - OWNER - full
 . EveryOne - read
 . System - full
 . Interactive - FULL
Se accedo come administrator le vedo, se accedo come user non vedo i
component?
Perche'?
L'errore e' access denied.
Il Packege ha Enable autorization cheking.
Mi puoi aiutare? Sono nella disperazione piu' totale...
Nel client win98 dicono di lanciare DCOMCNFG, ma non c'e'...come si fa?
Grazie

 ha scritto nel messaggio
news:8phufc$992$1...@news.flashnet.it...
