sql >> Database >  >> RDS >> Mysql

Hoe de gegevensbronverbinding correct te sluiten?

Merk op dat je .getConnection() . aanroept meerdere keren. Hoewel de documentatie op dit gebied duidelijker zou kunnen zijn DataSource.getConnection() daadwerkelijk opent een nieuwe verbinding (in tegenstelling tot het retourneren van een bestaande), dus u moet elke instantie die door die methode wordt geretourneerd, sluiten.

Als .getConnection() maakt een nieuwe instantie elke keer dat deze regel wordt aangeroepen, is een verbindingslek, omdat de verbinding die wordt geretourneerd niet wordt gesloten:

pstmt = dataSource.getConnection().prepareStatement(query);

En deze regel opent verkwistend een nieuwe verbinding om deze onmiddellijk te sluiten:

dataSource.getConnection().close();

Het lijkt erop dat u een afzonderlijke verbinding probeert te openen en te sluiten voor elke aanroep van isValidUser() (aangezien je de verbinding verbreekt aan het einde van die methodeaanroep). Zelfs als je het hierboven beschreven lek oplost, is dat niet hoe verbindingen bedoeld zijn om te worden gebruikt. In plaats daarvan moet u één verbinding (of een klein aantal) delen met uw toepassing. Dus wanneer je programma opstart, open je zo'n verbinding, en eenmaal het hele programma de verbinding niet meer nodig heeft (vaak kort voor het beëindigen) sluit je deze.

Dit soort gedrag wordt gewoonlijk geïmplementeerd door afhankelijkheidsinjectie , waar u uw verbindingen en andere bronnen construeert en ze vervolgens doorgeeft aan alle objecten die ze nodig hebben - dit ontkoppelt bronbeheer van de code die deze bronnen gebruikt. Als een simplistisch voorbeeld:

public static void main(String[] args) {
  DataSource dataSource = createDataSource();
  try (Connection connection = dataSource.getConnection()) {
    runProgram(connection);
  }
}


/**
 * this method doesn't need to worry about closing the Connection,
 * it trusts that its caller will be responsible for that.
 */
private static void runProgram(Connection connection) {
  // ...
}

Als vuistregel geldt dat objecten alleen verantwoordelijk moeten zijn voor het sluiten van objecten die ze construeren, en moeten voorkomen dat objecten die ze passeren sluiten. In uw huidige code UserDaoImpl is de verbinding aan het openen, dus het zou verantwoordelijk moeten zijn voor het sluiten ervan, maar ik stel voor om de Connection door te geven in plaats daarvan.



  1. org.hibernate.ObjectDeletedException:verwijderd object zou opnieuw worden opgeslagen door cascade (verwijder verwijderd object uit associaties)

  2. Hoe kan ik tabelgegevens weergeven met Java Stored Procedure?

  3. Oracle dubbele rij N keer waarbij N een kolom is

  4. MySQL-instructie duurt meer dan een minuut om uit te voeren