Strategie pracy z bazami danych SQL

Adobe AIR 1.0 i starsze wersje

Poniżej przedstawiono różne sposoby, które umożliwiają aplikacji dostęp do lokalnej bazy danych SQL oraz pracę z tą bazą. Projekty aplikacji mogą być różne pod względem organizacji kodu aplikacji, kolejności i czasu wykonywania operacji itp. Wybrane techniki mogą mieć wpływ na łatwość projektowania aplikacji. Mogą również wpływać na łatwość modyfikowania aplikacji w przyszłych aktualizacjach. Mogą również wpływać na działanie aplikacji z perspektywy użytkownika.

Dystrybucja wstępnie uzupełnionej bazy danych

Jeśli w aplikacji używana jest lokalna baza danych SQL AIR, wówczas aplikacja oczekuje bazy danych z określoną strukturą tabel, kolumn itp. Niektóre aplikacje oczekują również na wstępne wprowadzenie pewnych danych do pliku bazy danych. Jednym sposobem zapewnienia poprawnej struktury bazy danych, jest utworzenie bazy danych w kodzie aplikacji. Po załadowaniu aplikacja sprawdza, czy w określonej lokalizacji istnieje plik bazy danych. Jeśli plik nie istnieje, wówczas aplikacja wykonuje zestaw komend w celu utworzenia pliku bazy danych, utworzenia struktury bazy danych oraz w celu wstępnego wprowadzenia danych do tabel.

Kod, który tworzy bazę danych oraz jej tabele, jest często złożony. Często jest używany tylko jeden raz po zainstalowaniu aplikacji, ale powoduje zwiększenie wielkości i złożoności aplikacji. Zamiast programowego tworzenia bazy danych, struktury i danych można dystrybuować wstępnie wypełnioną bazę danych z aplikacją. W celu dystrybucji wstępnie zdefiniowanej bazy danych należy dołączyć plik bazy danych do pakietu aplikacji AIR.

Plik bazy danych w pakunku — podobnie jak wszystkie pliki znajdujące się w pakiecie AIR — jest instalowany w katalogu aplikacji (katalog reprezentowany przez właściwość File.applicationDirectory ). Jednak pliki w tym katalogu mogą być tylko odczytywane. Zastosowanie pliku z pakietu AIR jako „szablonowej” bazy danych. Przy pierwszym uruchomieniu aplikacji należy skopiować oryginalny plik bazy danych do Wskazywanie na katalog zapisu aplikacji użytkownika (lub innej aplikacji), a następnie wykorzystać tę bazę danych w aplikacji.

Sprawdzone procedury pracy z lokalnymi bazami danych SQL

Poniżej przedstawiono listę sugerowanych technik, które mogą być używane w celu poprawy wydajności, bezpieczeństwa i łatwości obsługi aplikacji podczas pracy z lokalnymi bazami danych SQL.

Wstępne tworzenie połączeń z bazą danych

Nawet jeśli aplikacja nie wykonuje żadnych instrukcji przy pierwszym ładowaniu, należy utworzyć instancję obiektu SQLConnection i z wyprzedzeniem wywołać jego metodę open() lub openAsync() (np. po pierwszym uruchomieniu aplikacji), aby uniknąć opóźnień w czasie wykonywania instrukcji. Zobacz Połączenie z bazą danych .

Ponowne wykorzystanie połączeń z bazą danych

Jeśli przez cały czas wykonywania aplikacji utrzymywane jest połączenie z bazą danych, należy zachować odwołanie do instancji SQLConnection i wykorzystywać je w całej aplikacji — jest to rozwiązanie lepsze niż zamykanie i ponowne otwieranie połączeń. Patrz Połączenie z bazą danych .

Zalecane stosowanie trybu wykonywania asynchronicznego

Podczas pisania kodu aplikacji kuszące może być synchroniczne wykonywanie operacji, ponieważ korzystanie z operacji synchronicznych często wymaga stosowania krótszego i mniej złożonego kodu. Jednak zgodnie z opisem w sekcji Korzystanie z synchronicznych i asynchronicznych operacji bazy danych operacje synchroniczne powodują zmniejszenie wydajności, co dostrzegają użytkownicy i co wpływa na ich zadowolenie z użytkowania aplikacji. Ilość czasu przeznaczona na wykonanie jednej operacji jest uzależniona od operacji oraz od ilości danych, jakie biorą udział w operacji. Na przykład: instrukcja SQL INSERT , która dodaje tylko jeden wiersz do bazy danych, trwa krócej niż instrukcja SELECT , która pobiera tysiąc wierszy danych. Gdy jednak tryb synchroniczny jest używany do wykonywania wielu operacji, wówczas operacje są zwykle połączone ze sobą. Nawet jeśli czas wykonania jednej operacji jest krótki, działanie aplikacji zostaje wstrzymane do czasu wykonania wszystkich operacji synchronicznych. W rezultacie łączny czas wielu operacji może być tak długi, że spowoduje drastyczne wydłużenie czasu oczekiwania na odpowiedź aplikacji.

Jako standardowe podejście należy stosować aplikacje asynchroniczne — szczególnie w przypadku operacji, które obejmują duże liczby wierszy. W sekcji Uzyskiwanie wyników SELECT w częściach opisano technikę dzielenia operacji przetwarzania dużych zestawów wyników instrukcji SELECT . Jednak ta technika może być stosowana tylko w trybie wykonywania asynchronicznego. Operacje synchroniczne powinny być stosowane tylko wówczas, gdy nie można uzyskać określonego działania za pomocą operacji asynchronicznych; po uwzględnieniu obniżenia wydajności, z którym będą musieli borykać się użytkownicy; oraz po przetestowaniu aplikacji i określeniu wpływu tych operacji na wydajność aplikacji. Wykonywanie asynchroniczne może wymagać bardziej złożonego kodowania. Jednak należy pamiętać o tym, że programista pisze kod tylko raz, a użytkownicy będą wielokrotnie korzystać z kodu działającego powoli lub szybko.

W wielu przypadkach zastosowanie osobnej instancji klasy SQLStatement dla każdej wykonywanej instrukcji SQL umożliwia jednorazowe utworzenie kolejki z wielu operacji SQL, co sprawia, że kod asynchroniczny przypomina kod synchroniczny — pod względem sposobu jego pisania. Więcej informacji zawiera sekcja Wyjaśnienie modelu wykonywania asynchronicznego .

Stosowanie osobnych instrukcji SQL i brak zmian właściwości text klasy SQLStatement

Dla każdej instrukcji SQL, która jest wykonywana więcej niż jeden raz w aplikacji, należy utworzyć osobną instancję klasy SQLStatement. Ta instancja SQLStatement powinna być wykorzystywana przy każdym wykonaniu polecenia SQL. Przykład: załóżmy, że tworzona jest aplikacja, która zawiera cztery różne operacje SQL, które są wykonywane wiele razy. W takim przypadku należy utworzyć cztery osobne instancje klasy SQLStatement i wywołać metodę execute() w celu uruchomienia każdej instrukcji. Należy unikać podejścia odwrotnego, czyli używania jednego wystąpienia klasy SQLStatement dla wszystkich instrukcji SQL oraz ponownego definiowania właściwości text przed każdym wykonaniem instrukcji.

Stosowanie parametrów instrukcji

Należy stosować parametry klasy SQLStatement — nigdy nie należy konkatenować danych wprowadzonych przez użytkownika do tekstu instrukcji. Korzystanie z parametrów sprawia, że aplikacja jest bardziej bezpieczna, ponieważ zapobiega ewentualnym atakom SQL inject. Umożliwia stosowanie obiektów w zapytaniach (zamiast stosowania samych wartości literałowych SQL). Sprawia również, że instrukcje działają bardziej wydajnie, ponieważ mogą być używane wielokrotnie bez konieczności ponownej kompilacji przy każdym wykonaniu. Więcej informacji zawiera sekcja Korzystanie z parametrów w instrukcjach .