Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Kotlin] MariaDB e max_user_connections

    ciao!

    ho specificato il linguaggio, anche se il problema non penso sia quello.

    in sostanza devo scorrere una cartella, e per ogni file trovato devo inserire un record nel db.
    in totale sono 1938 files al momento.

    dopo ogni inserimento chiudo la connessione, però ottengo questo errore:
    codice:
    fun main(args: Array<String>) {
        getMusica()
    }
    
    fun getMusica() {
        truncateTable("canzoni")
        println("==========")
        println("Inizio importazione Musica")
    
        val folder = "/run/media/fermat/DATI/Personal/Musica/"
        var cntTot = 0
    
        val cmd = "INSERT INTO canzoni VALUES(?, ?, ?, NOW(), NOW())"
    
        File(folder)
            .walk()
            .sortedBy { it.name }
            .forEach {
                cntTot++
    
                // ALTRO
    
                val preparedStmt: PreparedStatement = getClient().prepareStatement(cmd)
                preparedStmt.setString(1, it.name)
                preparedStmt.setString(2, autore)
                preparedStmt.setString(3, genere)
                preparedStmt.execute()
                getClient().close()
    
                Thread.sleep(1000)
                println(it.name)
            }
    
        println("==========")
        println("Totale canzoni: $cntTot")
    }
    
    fun truncateTable(table: String) {
        val statement: Statement = getClient().createStatement()
        statement.executeUpdate("TRUNCATE $table")
        getClient().commit()
        getClient().close()
    }
    
    fun getClient(): Connection {
        return DriverManager.getConnection(
            "........."
        )
    }
    che strategia posso adottare per evitare questo problema?
    considerando che non posso modificare quel parametro purtroppo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    che strategia posso adottare per evitare questo problema?
    considerando che non posso modificare quel parametro purtroppo.
    Il punto è stai facendo "troppe" Connection!!!

    La funzione getClient() restituisce una NUOVA Connection ogni volta.

    val statement: Statement = getClient().createStatement()
    qui ottieni una Connection, ci invochi subito createStatement() ma della Connection NON mantieni il riferimento e quindi NON la chiudi.

    getClient().commit()
    qui stai committando una Connection appena creata .. è inutile.

    getClient().close()
    qui stai facendo il close() (corretto) ma di una Connection su cui non hai fatto nulla.

    In sostanza, non può funzionare correttamente così (e non ha senso).

    Quindi le soluzioni:

    - o fai tutta la "solita" trafila di operazioni tipiche dell'uso diretto di JDBC.
    - o usi un qualche framework/libreria apposito (anche solo MyBatis, per dire).
    - o, per evitare la "solita" trafila di operazioni, ti fai una sorta di JDBC "template" (concettualmente similare al JdbcTemplate di Spring) anche se ovviamente limitato/ristretto ai tuoi casi d'uso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    si hai ragione, non ci avevo pensato!

    infatti mi è bastato copiare questa riga nelle varie funzioni invece che usare getClient() ed ha funzionato:
    codice:
    val client: Connection = DriverManager.getConnection(url)
    e vabbè adesso vedo, perchè è progettino personale, non è una cosa così importante da usare un framework/libreria.

    ma se invece usassi singleton??

  4. #4
    ho fatto una rapida ricerca:
    codice:
    import java.sql.Connection
    import java.sql.DriverManager
    
    object DBManager {
    
        init {
            println("CONNESSIONE AL DB")
        }
    
        fun getClient(): Connection {
            val url = "....."
            return DriverManager.getConnection(url)
        }
    
    }
    e poi nelle funzioni:
    codice:
    val client: Connection = DBManager.getClient()
    non so quanto sia bello, perè ho fatto diversi test, e sembra funzionare!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.