Baza danych, jak utrzymać połączenie

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!

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ą.

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.

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.

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();

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