Mysql
 sql >> база данни >  >> RDS >> Mysql

Как правилно да затворя връзката с източник на данни?

Забележете, че извиквате .getConnection() много пъти. Въпреки че документацията може да е по-ясна на този фронт DataSource.getConnection() всъщност отваря нова връзка (за разлика от връщането на съществуваща), следователно трябва да затворите всеки екземпляр, върнат от този метод.

Като .getConnection() създава нов екземпляр всеки път, когато се извика този ред е изтичане на връзка, тъй като не затваря връзката, която се връща:

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

И този ред разточително отваря нова връзка само за да я затвори веднага:

dataSource.getConnection().close();

Изглежда, че се опитвате да отворите и затворите отделна връзка за всяко извикване на isValidUser() (тъй като затваряте връзката в края на извикването на този метод). Дори и да отстраните изтичането, описано по-горе, не е предвидено да се използват връзките. Вместо това трябва да споделите една връзка (или малък брой от тях) във вашето приложение. Така че, когато вашата програма се стартира, вие отваряте такава връзка и веднъж цялата програма вече не се нуждае от връзката (често малко преди прекратяване), затворете я.

Този вид поведение обикновено се прилага чрез инжектиране на зависимост , където създавате вашите връзки и други ресурси и след това ги предавате на всички обекти, които се нуждаят от тях - това отделя управлението на ресурсите от кода, който използва тези ресурси. Като опростен пример:

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

Като основно правило, обектите трябва да отговарят само за затварянето на обекти, които конструират, и трябва да избягват затварянето на обекти, които са предадени. В текущия ви код UserDaoImpl отваря връзката, така че трябва да е отговорен за затварянето й, но предлагам да прехвърлите Connection вместо това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете минимални и максимални стойности с една MySQL заявка с Group BY

  2. mysql - заявка за три таблици

  3. MySQL НЕ В Заявката е много по-бавна след надстройка на Mysql

  4. php artisan migrate хвърляне [PDO Exception] Не можа да се намери драйвер - Използване на Laravel

  5. ROW_NUMBER в SQL – Изберете Най-добър пример в SQL и SQL Server