Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[java]Aplikacja bazodanowa pytania.

# 11 Wrz 2011 10:31 2036 5
  • #1 11 Wrz 2011 10:31
    #
    Poziom 13  

    Witam!

    Piszę aplikację bazodanową. Program ma łączyć się z bazą MySql na serwerze zewnętrznym. Będzie on używany przez kilkoro ludzi, niewykluczone że w jednym czasie. Proszę o radę osób, które takie aplikacje pisały, w jaki sposób zabezpieczyć się przed nadpisywaniem danych? Przy starcie programu ściągnąć całą bazę, wykonywać na niej operacje i wysłać ją na serwer, czy po każdej zmianie wpisu wysyłać dane na serwer. Kiedy aktualizować dane? Proszę o praktyczne rady związane z moimi wątpliwościami jak również o inne, związane z pisaniem aplikacji bazodanowej.

    Dodam że w Javie pisałem tylko projekt\zaliczenie i uważam że raczej kiepsko u mnie z pisaniem obiektowym. Ze znajomością SQL jest podobnie i pewnie jeszcze nie raz o coś zapytam.

    Mam jeszcze jedno pytanie: Mam klasę a, która tworzy obiekt klasy b. jak mogę dostać się do zmiennych z instancji klasy a poprzez obiekt klasy b?
    Bardziej obrazowo:
    Pisząc moje zaliczenie miałem klasę dziedziczącą po JFrame, która tworzyła obiekt klasy QueryTableModel, który to potrzebował dostępu do pewnej zmiennej z mojej ramki. Rozwiązałem to poprzez tworzenie QTM w taki sposób: qtm = new QueryTableModel(statement);. Wydaje mi się to niepoprawne.

    Proszę o rady i pozdrawiam #.

    0 5
  • #2 11 Wrz 2011 14:18
    McMonster
    Poziom 32  

    # napisał:
    Proszę o radę osób, które takie aplikacje pisały, w jaki sposób zabezpieczyć się przed nadpisywaniem danych? Przy starcie programu ściągnąć całą bazę, wykonywać na niej operacje i wysłać ją na serwer, czy po każdej zmianie wpisu wysyłać dane na serwer. Kiedy aktualizować dane? Proszę o praktyczne rady związane z moimi wątpliwościami jak również o inne, związane z pisaniem aplikacji bazodanowej.


    Zapewne powinieneś poczytać o transakcjach i regule ACID. Ściąganie całej bazy i potem jej odsyłanie nie ma sensu właśnie z powodu możliwości "zepsucia" czegoś w międzyczasie przez innego użytkownika.

    # napisał:
    Mam jeszcze jedno pytanie: Mam klasę a, która tworzy obiekt klasy b. jak mogę dostać się do zmiennych z instancji klasy a poprzez obiekt klasy b?
    Bardziej obrazowo:
    Pisząc moje zaliczenie miałem klasę dziedziczącą po JFrame, która tworzyła obiekt klasy QueryTableModel, który to potrzebował dostępu do pewnej zmiennej z mojej ramki. Rozwiązałem to poprzez tworzenie QTM w taki sposób: qtm = new QueryTableModel(statement);. Wydaje mi się to niepoprawne.


    Najprostszym sposobem jest przekazanie referencji do tworzącego obiektu obiektowi tworzonemu, a dalej dostęp przez odpowiednie metody tego pierwszego. Nie jest to niepoprawne.

    0
  • #3 13 Wrz 2011 19:01
    #
    Poziom 13  

    Troszeczkę poczytałem i mam kolejne pytanie. Podczas blokady wiersza blokowany jest sam zapis czy zapis i odczyt? Chodzi mi o to czy jeżeli w danym momencie ktoś będzie edytował pewien rekord to druga osoba nie zobaczy go po wyświetleniu całej bazy? To co czytałem było trochę chaotyczne i nie znalazłem tam odpowiedzi na moje pytanie.

    0
  • #4 13 Wrz 2011 19:19
    McMonster
    Poziom 32  

    Po prawdzie nie wiem, jak to jest rozwiązane w konkretnych implementacjach baz danych (możliwości jest wiele, a temat szerszy, niż bazy danych), ale raczej do zakończenia transakcji odczytać można starą wartość, a modyfikuje się najpierw lokalną kopię rekordu (rekordu, nie wiersza).

    0
  • #5 13 Paź 2011 23:08
    Fedmachn
    Poziom 8  

    Co do posiadania uchwytów przez klasy w górę i w dół to jest rzecz której raczej powinno się unikać. Jest kilka specyficznych zachowań które się w ten sposób robi ale moim zdaniem to są raczej wyjątki. Zachowanie takie prowadzi bardzo często do powstawania kodu "spagetti", wszelki późniejszy refactoring jest piekielnie trudny, o reużywalności kodu nawet nie wspomnę. Lepszym rozwiązaniem jest przekazywanie informacji poprzez setery oraz getery z klasy nadrzędnej do podrzędnej. Innym rozwiązaniem jest utworzenie klasy która służy tylko do przechowywania wspólnych informacji a następnie przekazanie jej z klasy nadrzędnej do klasy podrzędnej. Kod taki jest o wiele bardziej przejrzysty/podatny na przyszłe modyfikacje. Co do zapewnienia aby użytkownicy nie nadpisywali sobie danych dosyć prostym sposobem jest optymistic lock Link. W skrócie może to polegać na tym iż dodajesz specjalną kolumnę która oznacza wersję rekordu. W czasie odczytu rekordu z bazy danych zapamiętujesz go jako numer wersji. Następnie przy zapisie danych sprawdzasz przed comitem czy wersja jaką posiadasz jest identyczna jak ta na bazie danych. Jeśli tak to zwiększasz wersję i comitujesz. Jeśli nie to robisz rolback i rzucasz w twarz userowi że ktoś mu podmienił dane.

    0
  • #6 28 Mar 2012 13:13
    #
    Poziom 13  

    Witam po dłuższej przerwie.

    Sporo czasu minęło od rozpoczęcia prac nad aplikacją. Powstała nawet pierwsza niedoskonała wersja. Podszkoliłem się przez ten czas z baz danych i pisania w Javie. Mam teraz nowe pytanie do wyświetlania rekordów z bazy w jTable. Do teraz bawiłem się w ręczne łączenie z bazą, sam pisałem zapytania i wyświetlałem je w tabeli. Na szczęście odkryłem coś takiego jak PersistenceUnit. Teraz dane w tabeli wyświetlam klikając prawym przyciskiem na tabeli -> Bind -> elements ->Import Data to Form. Moje pytanie jest następujące: jak wyświetlać wybrane pole z referencji do tabeli zamiast entity.nazwaTabeli[id = 3].



    --------------------------
    Wpadło mi do głowy rozwiązanie. Pokombinuję z modelem tej tabeli. Nadal proszę o inne rozwiązania, bądź komentarze do mojego pomysłu.

    0