Baza danych, jak utrzymać połączenie

Odpowiedz Nowy wątek
2012-07-16 19:55

Rejestracja: 9 lat temu

Ostatnio: 7 lat temu

0

Witam!!

Pisze większa aplikacje która jest podzielona na moduły itp. I mam pytanie odnośnie bazy danych z którą się łącze(SQL 2008), tak więc:
jak mam utrzymywać połączenie z baza tzn czy muszę zrobić osobnego dll dla bazy danych i wywoływać ją wtedy kiedy potrzebuje np wrzucić jakieś dane?? Czy ma być cały czas połączona(ale wydaje mi się ze tak być nie może). Tak więc proszę o jakieś konkretne odpowiedzi w jaki sposób rozwiązać ten problem z góry dziękuje i proszę o wyrozumiałość.

Pozdrawiam!

Pozostało 580 znaków

2012-07-16 22:17

Rejestracja: 13 lat temu

Ostatnio: 5 lat temu

0

IMO baza powinna być cały czas połączona. Łączenie się z od nowa z tą samą bazą przy każdym zapytaniu nie ma raczej sensu i może spowalniać program.
U siebie używam singletona, z którego pobieram obiekt reprezentujący połączenie (np. SqlConnection). Przy tym singleton sam sprawdza, czy połączenie ciągle działa. Jeśli nie, to obsługuje odpowiednio błąd. W moim wypadku próbuje się jeszcze raz połączyć z bazą.

Pozostało 580 znaków

emfałsi
2012-07-16 22:26
emfałsi
2

A może zamiast SqlConnection warto zapoznać się z jakimś ORMem ? Np. Entity Framework czy NHibernate, znacząco ułatwia korzystanie z bazy danych.

Oczywiście, że warto. Ja pisałem o projekcie, który ma już z 15 lat. Wtedy chyba nikt nie miał pojęcia o istnieniu jakichś tam ORMów. - pozytywista 2012-07-17 18:45

Pozostało 580 znaków

2012-07-17 08:40

Rejestracja: 9 lat temu

Ostatnio: 1 godzina temu

0

Czy ma być cały czas połączona(ale wydaje mi się ze tak być nie może).

Jeżeli program często korzysta z bazy danych, to nie tylko tak być może, ale nawet tak być powinno.

Pozostało 580 znaków

2012-07-17 09:28

Rejestracja: 15 lat temu

Ostatnio: 6 lat temu

0

Tak naprawdę rozłączenie z bazą nie powoduje fizycznego rozłączenia. Połączenie i tak jest trzymane cały czas, a gdy program zażąda połączenia ponownie, jest używane to już zestawione. Tak przynajmniej działało to z mysql i mysql connectorem, specjanie sprawdzałem czy na pewno tak jest.

Więc równie dobrze mozna dać wszystko pod using i łączyć się z bazą za każdym razem, na wydajność to znacząco wpłynąć nie powinno.

Co do ORM - no bardzo fajne, ułatwia ale przejrzystość bardziej skomplikowanych zapytań... dla początkujących może to wyglądać nieco "dziwnie", np:

ctx.MiejscaPrzechowywania
    .SelectMany(d => ctx.Materialy, (a, b) => new { a, b })
    .Where(x => x.b.MA_ID == x.a.MA_ID)
    .SelectMany(y => ctx.Osoby, (g, h) => new { g, h })
    .Where(y => y.h.OS_ID == y.g.a.MP_FK_OS_ID_KOMU_WYDANO)
    .Select(x => new
    {
        x.g.b.KT_ETYKIETA,
        x.g.a.MA_LP,
        x.g.b.MA_DATA_REJESTRACJI,
        x.g.b.MA_INF_O_ZMIANIE_KLAUZULI,
        x.g.a.MP_NR_RTD_TECZKI,
        x.h.OS_ETYKIETA,
        x.g.a.MP_FK_KO_ID_WLASCICIEL_MP,
        x.g.a.JR_NAZWA
    }).ToList();

Chociaż, bardziej "normalnie też można:

 (from a in ctx.MiejscaPrzechowywania
  from b in ctx.Materialy
  where b.MA_ID == a.MA_ID
  from h in ctx.Osoby
  where h.OS_ID == a.MP_FK_OS_ID_KOMU_WYDANO
  select new 
    { 
          KT_ETYKIETA = b.KT_ETYKIETA, 
      MA_LP = a.MA_LP, 
          MA_DATA_REJESTRACJI = b.MA_DATA_REJESTRACJI, 
          MA_INF_O_ZMIANIE_KLAUZULI = b.MA_INF_O_ZMIANIE_KLAUZULI, 
      MP_NR_RTD_TECZKI = a.MP_NR_RTD_TECZKI, 
      OS_ETYKIETA = h.OS_ETYKIETA, 
      MP_FK_KO_ID_WLASCICIEL_MP = a.MP_FK_KO_ID_WLASCICIEL_MP, 
      JR_NAZWA = a.JR_NAZWA 
    }).ToList();
edytowany 2x, ostatnio: othello, 2012-07-17 09:42
Boże, jakie ty masz nazwy tutaj. Co oznacza: MP_FK_KO_ID_WLASCICIEL_MP? - siararadek 2012-07-17 09:44
Tajny szyfr :) Trzeba by było spytać tego co bazę projektował (nie ja), zresztą znając projekt łatwo rozszyfrować. Fakt że w EF mogłem sobie nazwy zmienić ale już mi się nie chciało. - othello 2012-07-17 10:01

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0