Fluent NHibernate i operacje async/await

Fluent NHibernate i operacje async/await
N0
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Kraków
  • Postów:767
0

Hej,

z tego co widzę FNH nie wspiera async/await. W takim razie też pytanie czy go używacie czy nie?
Mam API do apki mobilnej, mam tam operacje IO do bazy danych i zastanawiam się na jakiej podstawie powinienem podjąć decyzje o używaniu async/await-ów przy tych operacjach. Możecie mi pomóc z tym?


Pomogłem? To dobrze :)
ekhart
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:ekhart.pl
  • Postów:140
0

Jeśli struktura Twojej bazy danych nie będzie się zmieniać (albo będzie się to działo rzadko) o Enitity Framework wspiera async/await. Jego użyłbym.


JP
A jak baza zmienia się częściej to nie polecałbyś EF?
ekhart
Raczej nie, bo każda zmiana struktury bazy danych wymaga regeneracji struktury EF. Jeśli twoja aplikacja tworzy tabele bazy danych w runtimie to raczej nie jest rozwiązanie.
JP
A można nieco szerzej? Bo nie rozumiem problemu. Co to znaczy regeneracja struktury EF?
somekind
Nie trzeba niczego regenerować, EF wspiera także code first.
JP
A nawet Code First from Database :)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
0

A jaki jest zysk z async/await na bazie?

Zobacz pozostałe 5 komentarzy
somekind
Async nadal nie rozwiąże problemu z GUI, bo zresztą i nie do tego służy. Dla mnie API jest jednoznaczne - chodzi o jakiś webserwis, ale może faktycznie to moja nadinterpretacja. Da się w ogóle użyć Fluent NH w jakiejś technologii do aplikacji moblinych?
JU
Nie wiem. No, ale jak async nie rozwiąże problemów z GUI? Przecież właśnie do tego został stworzony. Żeby nie blokować wątku głównego (wątku, który wywołuje operację).
somekind
Nie, absolutnie nie do tego powstał async. A problemem z GUI jest chociażby poinformowanie użytkownika, że operacja wykonuje się w tle.
JU
"Asynchrony proves especially valuable for applications that access the UI thread because all UI-related activity usually shares one thread. If any process is blocked in a synchronous application, all are blocked. Your application stops responding, and you might conclude that it has failed when instead it's just waiting." - https://msdn.microsoft.com/library/hh191443(vs.110).aspx
somekind
Ech, no dobra, z oficjalną dokumentacją się nie kłócę. Chociaż uważam to za naciągane, bo problemy z UI były od dawna rozwiązane na całkiem inne sposoby, podobnie jak od dawna można łatwo i zgrabnie wykonywać zadania w tle.
N0
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Kraków
  • Postów:767
0

@somekind: jaka jest?? nie wiem, WYDAJE mi się że zapis do DB ogólnie powinien być asynchroniczny. Tworzę apkę mobilną wraz z API, jeśli user wykona akcję która musi np. odpytać bazę no to sam odczyt DB powinien być asynchroniczny tak?

@ekhart : moja DB nie będzie w runtime zmieniana. EF daje opcję używania async/await ale co z tego skoro używam FNH i to jest pytanie dotyczące tego rozwiązania.

Ale tak sobie myślę: skoro metody w kontrolerach API mam async/await to sam odczyt DB gdzieś głębiej już chyba takowy nie musi być nie?


Pomogłem? To dobrze :)
edytowany 1x, ostatnio: ne0
JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
1

Ale async w api chyba nic nie ma do UI aplikacji Android.
Jak EF czy NH to odczyta to nie ma znaczenia.
Na Andoidzie zrób AsyncTask, który poczeka na dane z API i jak je dostanie to wyświetli. API i tak zwróci Ci fizycznie dane dopiero jak je wyciągnie z bazy. Albo użyj AsyncHttpClient do komunikacji.

Tu masz przykład z jakiejś mojej aplikacji z AsyncHttpClient, która wywołuje endpoint API i jak dostanie dane to zwraca w metodzie SetRollsInWysylka, która formatuje list e i wyświetla na ekranie

Kopiuj
    private void GetRollsInWysylka(int wysId)
    {
        // pobranie listy kręgów w dostawie
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        //params.add("DostawaId", String.valueOf(dostawa.Id));

        String url = getConfig().getServerAddress() + ServiceUrl.WYSYLKA_GET_ROLLS+wysId;

        client.get(this, url, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {
                Log.d(TAG, "LoadDostawcy success..");
                Gson gson = new Gson();
                Type type = new TypeToken<ArrayList<RollFullViewModel>>(){}.getType();
                ArrayList<RollFullViewModel> d = gson.fromJson(new String(responseBody), type);
                SetRollsInWysylka(d);
            }

            @Override
            public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {
                Log.d(TAG, "Błąd pobrania kręgów");
                Toast.makeText(WysylkaViewActivity.this, "Wystąpił błąd pobrania kręgów", Toast.LENGTH_LONG).show();
            }
        });

    }

to w Javie jakby co.

edytowany 2x, ostatnio: jacek.placek
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
3
ne0 napisał(a):

@somekind: jaka jest?? nie wiem, WYDAJE mi się że zapis do DB ogólnie powinien być asynchroniczny. Tworzę apkę mobilną wraz z API, jeśli user wykona akcję która musi np. odpytać bazę no to sam odczyt DB powinien być asynchroniczny tak?

Ale co to daje użytkownikowi, czy to będzie asynchroniczne czy nie? Podejrzewam, że większość użytkowników nawet nie zna tego słowa. Użytkownik chce, aby aplikacja działało szybko, nie zamrażała interfejsu, a jeśli robi coś długo, to żeby informowała o tym.

Ale tak sobie myślę: skoro metody w kontrolerach API mam async/await to sam odczyt DB gdzieś głębiej już chyba takowy nie musi być nie?

Nie, nie musi. I właściwie niczego nie daje.

W asynchronicznym API chodzi o to, aby serwer mógł obsłużyć więcej żądań. Bez asynchroniczności wątek przetwarzający żądanie jest zablokowany dopóki nie skończy swojej pracy. Jeśli działamy asynchronicznie, to wątek przetwarzający żądanie może zostać zwrócony do puli dostępnej dla serwera na czas wykonywania operacji na zasobie zewnętrznym. To zwiększa wydajność serwera WWW, bo zamiast biernie czekać aż np. skończy się odczyt z dysku czy pobieranie danych z innego serwisu, może zająć się żądaniem od następnego użytkownika, a więc w tym samym czasie przetworzy ich więcej.
W przypadku operacji bazodanowych też w teorii można zyskać, bo to przecież też dostęp do zewnętrznego zasobu. Tylko, że jeśli baza danych jest jedna, i wszystkie żądania z niej korzystają, to zysku żadnego nie będzie - bo serwer webowy może przetworzyć na raz więcej żądań niż bazodanowy. W tym przypadku baza będzie wąskim gardłem, więc walka o asynchroniczne za wszelką cenę zapytania nie ma sensu. Dlatego też ten ficzer w EF to taki spojler do trabanta. ;)

dam1an
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
  • Postów:1589
0

Ale zdaje się zakładasz tu że każdy request puka do bazy, a przecież część requestów może żądać dostępu do innych zasobów zewnętrznych. Wtedy dobrze jak by wątki czekające na odpowiedź z bazy też zostały zwolnione. Tak mi się wydaje.

JP
Chyba czegoś nie rozumiem, ale jakie znaczenie dla klienta (Android) ma czy metoda api (obojętnie czy bazodanowa, czy wołająca jakiś inny serwis) jest async? Chyba wywołanie z Androida powinno być async.
dam1an
To zostało całkiem dobrze wyjaśnione post wyżej, tu chodzi o zwiększenie wydajności serwera. Autor nie pyta się o metody w aplikacji mobilnej tylko metody w api.
JP
Tak. Ok. Doczytalem. Ale jest też poruszany temat UI i mam wrazenie, ze autorowi o to chodzilo.
N0
@jacek.placek: co ty chłopie masz z tym androidem???? co za różnica czy android czy ios? akurat apkę piszę w xamarinie na obie platformy...
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Wrocław
0
dam1an napisał(a):

Ale zdaje się zakładasz tu że każdy request puka do bazy, a przecież część requestów może żądać dostępu do innych zasobów zewnętrznych. Wtedy dobrze jak by wątki czekające na odpowiedź z bazy też zostały zwolnione. Tak mi się wydaje.

Oczywiście, że dobrze, aby tak było. Ale nie każdy request musi pukać do bazy, żeby ją zapchać, czasem wystarczy, że zrobi to 10%. Kwestia co konkretnie serwis robi.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)