Italian B4J - Error Java OutOfMemoryError

udg

Expert
Licensed User
Longtime User
Ma se volessi utilizzare due database mySQL1 e mySQL2 posso utilizzare una sola ConnectionPool o ne devo istanziare due distinte ?

Se inizializzi come nel mio post #6 , ovvero senza indicare uno specifico DB, allora ti basta una ConnectionPool per più DB.
Ovviamente dovrai citare il DB ogni volta che lo utilizzi.
es. sql1.ExecQuery(Select * from DB1.tablex)
e poi sql1.ExecQuery(Select * from DB2.tabelz) con sql1 ricavato dallo stesso CP.
 

udg

Expert
Licensed User
Longtime User
mi sento immotivatamente (dovrei scrivere "stupidamente") allegro
Si vede che il caffé ti ha fatto bene!
 

marco.canta

Active Member
Licensed User
Longtime User
Dopo un po di prove è uscito qualche problemino ... o_O
ho fatto un primo programma di test ed ha girato ininterrottamente per 2 giorni senza alcun problema

B4X:
Public Sub MainPgm()
    InitDB
    tmrMAIN.Enabled = True
End Sub


Sub tmrMAIN_Tick
    tmrMAIN.Enabled = False

    getData_1
    
    GetDaora
    putData_1(ValDaoraUnico)
    
    tmrMAIN.Enabled = True
End Sub


Public Sub InitDB   
    Try
        ConPool.Initialize("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:8889/DB64?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull", "root", "root")
        Log("DB Opened")
    Catch
        Log("Last Pool Init Except: "&LastException.Message)
    End Try

    Dim jo As JavaObject = ConPool
    jo.RunMethod("setMaxPoolSize", Array(100))
End Sub


Public Sub putData_1(Valdaora As String)

    mySql_DB64 = ConPool.GetConnection
    mySql_DB64.BeginTransaction
    Try
        mySql_DB64.ExecNonQuery($"UPDATE SerialDataAllDevice SET dataora = "$ & Valdaora & $" WHERE id = 1 ;"$)
        mySql_DB64.TransactionSuccessful
    Catch
        Log("Error putData 1")
        mySql_DB64.Rollback
    End Try
    
    mySql_DB64.Close

End Sub


Public Sub getData_1

    mySql_DB64 = ConPool.GetConnection
    mySql_DB64.BeginTransaction
    Try
        Dim RS As ResultSet
        RS = mySql_DB64.ExecQuery($"SELECT * FROM Servizi WHERE Servizio = '01';"$)
            RS.NextRow
            ListView1.Items.Add(RS.GetString("Lettera") & "-" & RS.GetString("Descrizione1"))
            mySql_DB64.TransactionSuccessful
    Catch
        Log("Error getData 1")
        mySql_DB64.Rollback
    End Try
    
    RS.Close
    mySql_DB64.Close

End Sub

unico dubbio che ho ' se il "mySql_DB64 = ConPool.GetConnection" va realmente definito prima di ogni "mySql_DB64.BeginTransaction" o solo una volta ad inizializzazione DB.




poi usando le stesse procedure, le ho inserite nel mio programma che aveva problemi ....
il risultato è che ora si avvia il programma e dopo circa un paio di minuti si blocca generando un errore di questo tipo :

error_Time_Out.png



non so cosa accada .... Help !

In questa fase il programma gira da solo e si interfaccia solo lui con il mySQL (MAMP), in fase definitiva, saranno tre programmi (differenti) che accederanno allo stesso Database visualizzando e scrivendo dati, ma questo avverrà dopo.
 

LucaMs

Expert
Licensed User
Longtime User
unico dubbio che ho ' se il "mySql_DB64 = ConPool.GetConnection" va realmente definito prima di ogni "mySql_DB64.BeginTransaction" o solo una volta ad inizializzazione DB.
Non mi va di studiare, so' troppo vecio :D.

Dato che hai questo dubbio, dovresti eseguire un test, "definendo", come hai scritto tu, "mySql_DB64 = ConPool.GetConnection" una sola volta.
In realtà non è la definizione ma la richiesta di una connessione, connessione che tu, giustamente, chiudi dopo ogni esecuzione di query, quindi penso sia corretto eseguire una GetConnection ogni volta.


Public Sub InitDB
Qui metterei una variabile di ritorno boolean che ti faccia sapere se la connessione sia stata stabilita, altrimenti qui:
Public Sub MainPgm()
InitDB
tmrMAIN.Enabled =
True
End Sub
avvieresti comunque il timer, generando altri errori, in caso di fallita connessione.

Public Sub InitDB As Boolean ' <---
Dim Result As Boolean = True ' <---
Try
ConPool.Initialize("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:8889/DB64?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull", "root", "root")
Log("DB Opened")
Catch
Log("Last Pool Init Except: "&LastException.Message)
Dim jo As JavaObject = ConPool
jo.RunMethod(
"setMaxPoolSize", Array(100))
Result = False
End Try

Return Result

End Sub


Public Sub MainPgm()
If InitDB Then
tmrMAIN.Enabled =
True
Else
' vedi tu
End If
End Sub


Leggo il resto :)...
 

LucaMs

Expert
Licensed User
Longtime User
Comunque, dovrei approfondire tutto l'argomento, non solo il tuo codice.
Devo invece decidermi a concentrarmi sul mio "progetto", altrimenti lo dovranno finire i "posteri".

Posso solo aggiungere che qualche post su come faccia io, senza problemi, almeno finora, lo avevo scritto ieri e quindi lo trovi ancora nel thread.

Sorry (tanto ci sarà @udg o altri a darti una mano ;))
 

marco.canta

Active Member
Licensed User
Longtime User
Grazie LucaMs ... per prima cosa provo ad effettuare una sola connessione ... e vediamo cosa succede ;)
 

marco.canta

Active Member
Licensed User
Longtime User
Buongiorno ...
dopo un lungo lavoro si riscrittura e adeguamento codice, il programma principale si collega e gira collegato al Mysql,
il problema ora mi nasce quando collego il secondo programma per la consultazione dati ( programma differente da quelle principale) si collega e dopo una trentina di secondi va in errore "Client connection has time out" , procedura di connessione come il principale, non so se dipenda dal mio software o dal server mySql.

Mi sono venuti un paio di dubbi, premettendo di avere qualche lacuna in merito ai mysql ...

- Come server locale MAMP (non Pro) va bene o mi consigliate qualcos'altro (Windows 7) ?
- Posso accedere da più programmi allo stesso mySql con lo stesso nome utente o ne occorre uno per ogni programma ? (io uso sesse credenziali per tutti i programmi)

Grazie Marco
 

LucaMs

Expert
Licensed User
Longtime User
Come server locale MAMP (non Pro) va bene o mi consigliate qualcos'altro (Windows 7) ?
Va benissimo; io uso XAMPP.

Posso accedere da più programmi allo stesso mySql con lo stesso nome utente o ne occorre uno per ogni programma ? (io uso sesse credenziali per tutti i programmi)
Risposta: non lo so :p

Ti consiglierei ciò che farei io: senza modificare il progetto sul quale stessi lavorando, ne creerei uno molto semplice, con una semplice lettura di un record da un'unica tabella e lancerei due istanze del sw b4j ;)

E poi vi farei sapere :D
 

marco.canta

Active Member
Licensed User
Longtime User
ok LucaMs ... rispolvero i programmini Server e Client che avevo fatto per testare le connessioni mySql .... testo e vi aggiorno ;)
 

marco.canta

Active Member
Licensed User
Longtime User
Eccomi con qualche aggiornamento ... allora, seguendo il suggerimento di LucaMs sono ripartito da un programma semplice che testasse le procedure.
Ho recuperato due programmi che avevo fatto a inizio progetto, uno (funzione Server) scrive 'data, ora e stato collegamento' su di un mySQL (usando la lib JSQL) e l altro (funzione Client) legge 'data, ora e stato collegamento' dal mySQL (usando la lib JSQL).
Tutto sembra funzionare, avviato ieri pomeriggio alle 16 continuava ad aggiornare i dati ... questa notte alle 2 ancora funzionava ... ma sorpresa questa mattina, ho trovato il PC che si era fermato e riavviato con un messaggio che non trovava piu l HardDisk. Spento e riacceso e ripartito.

Il dubbio ora è .... visto che scrivo ogni 250 ms dati sul mySQL che a sua volta fa accessi continui all HardDisc, questo potrebbe creare problemi ?
Ora sto provando un SSD al posto del classico HD ... chissa' o_O
 

udg

Expert
Licensed User
Longtime User
In generale, se non è critico che i dati debbano essere salvati su memoria di massa ogni 250ms, allora potresti "raccogliere" un certo numero di eventi scrittura in RAM (una specie di buffer) e poi riversare il tutto in un'unica operazione sulla memoria di massa (es. ogni 5 secondi)
 
Top