sql >> Database teknologi >  >> RDS >> Mysql

Hvordan lukkes datakildeforbindelsen korrekt?

Bemærk, at du kalder .getConnection() flere gange. Selvom dokumentationen kunne være klarere på denne front DataSource.getConnection() faktisk åbner en ny forbindelse (i modsætning til at returnere en eksisterende), så du skal lukke hver forekomst, der returneres fra denne metode.

Som .getConnection() opretter en ny instans, hver gang den kaldes. Denne linje er en forbindelseslækage, da den ikke lukker forbindelsen, der returneres:

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

Og denne linje åbner spildt en ny forbindelse kun for straks at lukke den:

dataSource.getConnection().close();

Det ser ud til, at du forsøger at åbne og lukke en separat forbindelse for hver påkaldelse af isValidUser() (da du lukker forbindelsen i slutningen af ​​det metodekald). Selvom du fikser lækagen beskrevet ovenfor, er det ikke sådan forbindelser er beregnet til at blive brugt. I stedet bør du dele en forbindelse (eller et lille antal af dem) på tværs af din applikation. Så når dit program starter op, åbner du sådan en forbindelse, og én gang hele programmet ikke længere har brug for forbindelsen (ofte kort før afslutning), lukker du den.

Denne form for adfærd implementeres almindeligvis af afhængighedsinjektion , hvor du konstruerer dine forbindelser og andre ressourcer og derefter overfører dem til de objekter, der har brug for dem - dette afkobler ressourcestyring fra den kode, der bruger disse ressourcer. Som et forenklet eksempel:

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) {
  // ...
}

Som en tommelfingerregel bør objekter kun være ansvarlige for at lukke objekter, de konstruerer, og bør undgå at lukke objekter, de passeres. I din nuværende kode UserDaoImpl åbner forbindelsen, så den burde være ansvarlig for at lukke den, men jeg foreslår, at du sender Connection ind. i stedet.



  1. MySQL indlæs data:Denne kommando er ikke understøttet i den forberedte sætningsprotokol endnu

  2. Installer db-oracle til node js

  3. Sådan installeres den seneste MySQL 8 på Debian 10

  4. Sådan opretter du en forespørgsel i Drupal 8