Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

JanuszAMXX - zdjęcie

JanuszAMXX

Rejestracja: 02.09.2018
Aktualnie: Nieaktywny
Poza forum Ostatnio: 24.06.2019 16:29
-----

#751975 [ROZWIĄZANE] Połączenie z bazą danych MySql - Optymalizacja

Napisane przez _McHappy w 03.09.2018 02:33

Tak, z tym, że należy to wstawić w odpowiednie miejsca tj. po zakończonych operacjach na danym uchwycie.
  • +
  • -
  • 1


#751972 [ROZWIĄZANE] Połączenie z bazą danych MySql - Optymalizacja

Napisane przez _McHappy w 02.09.2018 23:13

Patrząc na kod, który przytoczyłeś w pierwszym poście, można łatwo dostrzec, że nie zawsze zamykasz połączenie z bazą (czasem pomijasz przypadki, w których błąd przy wykonywaniu kwerendy powoduje wyjście z funkcji bez uprzedniego rozłączenia się z bazą. Innym razem - np. w funkcji od topki, połączenie w ogóle nie jest zamykane. Wystarczy 51 razy otworzyć topkę i problem murowany ;)). Upewnij się, że wszędzie, gdzie otwierasz połączenie z bazą, również je zamykasz.

Osobiście nie polecam stosować w tym przypadku tzw. stałego połączenia z bazą, gdyż wiąże się to z pewnymi komplikacjami (połączenie może zostać zerwane w każdej chwili, zasoby zajmowane przez połączenie - po stronie serwera sql - nie są zwalniane przez długi czas, a poza tym plusem modułu sqlx jest właśnie to, że umożliwia on częste łączenie i rozłączanie się z bazą przy zastosowaniu stałego uchwytu konfiguracji połączenia - tzw. DBConnectionTuple). Kwerendy wątkowane stosują połączenia krótkotrwałe i nie ma z nimi żadnego problemu, tak więc o ile nie masz kłopotu z długim nawiązywaniem połączenia z bazą, o tyle polecam poprawić błędy, które wymieniłem w wyżej wymienionej sekcji.
  • +
  • -
  • 2


#751971 [ROZWIĄZANE] Połączenie z bazą danych MySql - Optymalizacja

Napisane przez Ogen Dogen w 02.09.2018 22:55


Jeśli SQL_FreeHandle(SqlConnection) ma być globalne, to należy je jakość zadeklarować przy wykorzystaniu choćby new itp?

 

No tak, zadeklaruj je tak aby było globalnie dostępne, czyli np. pod includami zrób

new Handle:SqlConnection;

Natomiast zwolnienie zasobu przez SQL_FreeHandle ma być tylko w plugin_end.


  • +
  • -
  • 1


#751959 [ROZWIĄZANE] Połączenie z bazą danych MySql - Optymalizacja

Napisane przez Ogen Dogen w 02.09.2018 15:38

To jest ogólna zasada do wszystkich aplikacji wykorzystujących bazy danych (żeby tylko raz się łączyć), bez sensu łączyć się na nowo dla każdego zapytania (w ten sposób komercyjne aplikacje szybko by "zdosowały" silnik bazy). Nie pisałem pluginów w tym podejściu (z użyciem SQL_Connect), więc mogę się mylić.

W plugin_cfg zamień

new Handle:SqlConnection = SQL_Connect(g_SqlTuple, szErr, szError, charsmax( szError ))

Na

SqlConnection = SQL_Connect(g_SqlTuple, szErr, szError, charsmax( szError ))

Natomiast uchwyt SqlConnection utwórz gdzieś wyżej nad wszystkimi funkcjami, aby był globalny dostępny oraz usuń we wszystkich funkcjach

SQL_FreeHandle(SqlConnection); 

Stwórz event plugin_end i przenieś to do niego. Połączenie zamknie się samo przy końcu mapy.

 

W całej reszcie funkcji usuń również

new Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,szError,511) 

Od teraz powinieneś nawiązać jedno połączenie i tylko z niego korzystać.


  • +
  • -
  • 1


#751954 [ROZWIĄZANE] Połączenie z bazą danych MySql - Optymalizacja

Napisane przez Ogen Dogen w 02.09.2018 13:30

Teoretycznie najlepszym wyjściem byłaby tutaj zmiana hostingu lub wykupienie droższego pakietu. Jeśli chodzi o kod to zasadniczy błąd jaki zrobiłeś to to, że łączysz się na nowo z bazą przy każdym odczycie i zapisie (zakładając, że to się dzieje przy wchodzeniu i wychodzeniu graczy to dosyć łatwo przekroczyć limit) zamiast połączyć się raz przy starcie mapy, trzymać to połączenie cały czas aktywne i zamknąć je dopiero przy końcu mapy.

Łączysz się już raz w plugin_cfg i to wystarczy, utwórz globalny uchwyt i nie zwalniaj go od razu tylko dopiero w plugin_end.


  • +
  • -
  • 1