przekroczono zasoby systemu

0

Witam,
proszę o pomoc w rozwiązaniu problemu.
mam prostą aplikację która odpytuje co 5sec. tabelę dBaseIV 2.0 (dbf)
i zapisuje wynik w datatable i niby wszystko ok
jednak po ok 2 godzinach pracy programu pojawia się błąd "Przekroczono zasoby systemu"
przeglądając procesy w menagerze zadań okazuje się że każde odpytanie powoduje że zużycie pamięci zwiększa się o ok 100K, jakby coś nie zwalniało pamięci
poniżej kod (czyżby to sterownik OLEDB to powodował?)

using System.Data.OleDb;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DataSet dsTabele = new DataSet();
        DataTable dtObecni = new DataTable();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            string LancuchNorthwind = "Provider=Microsoft.Jet.OLEDB.4.0;" +
         "Extended Properties=dBASE IV; Data Source=C:\\Program Files\\SystemObecni\\";
            OleDbConnection PolaczNorthwind = new OleDbConnection(LancuchNorthwind);
            PolaczNorthwind.Open();

            string Zapytanie = "SELECT KONTROLER, PRACOWNIK, DATA, GODZINA FROM RCPOBECNI";
            OleDbCommand Polecenie = new OleDbCommand(Zapytanie, PolaczNorthwind);
            //Polecenie.Parameters.Add("NazwaMiasta", textBox1.Text);

            OleDbDataAdapter AdapterKlientow = new OleDbDataAdapter(Polecenie);
            dtObecni.Clear();
            dsTabele.Clear();
            AdapterKlientow.Fill(dsTabele, "Obecni");
            dtObecni = dsTabele.Tables["Obecni"];
            PolaczNorthwind.Close();

        }
    }
}
0

nie pracowałem nigdy na oledb, ale co mi się rzuciło w oczy (mniej istotne) to przenieś stringi, po co je tworzyć co 5, jak są takie same ?

spróbuj może użyć using na poleceniu

using(OleDbCommand Polecenie = new OleDbCommand(Zapytanie, PolaczNorthwind))
{
//kod
}

w sumie na Adapter też chyba możesz dać using

0

po wprowadzeniu modyfikacji wg Twoich sugestii Tomkos
aplikacja w momencie zapytania znacznie mniej używa procesora ( z 30% spadło do 9%)
jeśli chodzi o użycie pamięci to też jest lepiej ponieważ podczas zapytania zużywa ok 100K więcej pamięci ale zaraz maleje do ok 40-50

zapuszczę na całą noc i jutro dam znać

dzięki

0

Być może winne jest nieustanne otwieranie połączeń do bazy w pętli timera, które w końcu przekracza systemowy limit połączeń TCP.

0

somekind - strzał w dziesiątkę
łączę się tylko raz i utrzymuję ciągłe połączenie
teraz praktycznie nie zwiększają się pobory pamięci

jednak czy to jest najlepsze rozwiązanie (zwłaszcza że z tej tabeli będzie korzystał jeszcze jeden program) ?
wiem że tabele dBase są wrażliwa na pracę wielodostępową

0

Przy długim połączeniu rośnie ryzyko, że zostanie zerwane. Dlatego przewidź sytuację tymczasowej utraty komunikacji.

0

odpytywanie jest w bloku try catch
więc pytanie jak rozpoznać wyjątek związany z komunikacją aby go inaczej obsłużyć niż inne..

0

Pewnie dostaniesz wyjątek typu OleDbException. Na podstawie właściwości ErrorCode/HResult możesz rozpoznać co było problemem.
Przed użyciem connection możesz sprawdzać jego State. Ale i tak musisz być gotowy na to że w trakcie wysyłania zapytania nastapi problem z połączeniem i umieć je ponownie otworzyć.

0

założenia dopuszczają że wyniki mogę nawet otrzymywać za trzecim odpytaniem
ważne aby aplikacja nie wywaliła błędu a klient nie wiedział ze nie było komunikacji

0

Stwórz sobię metodę/klasę (statyczną, singleton, pozyskiwaną z fabryki etc., ważne żeby zawesze używać jednego połączenia), która wykona zapytanie wg takiego algorytmu:

  • sprawdź czy połączenie otwarte, nie reconnect
  • wykonaj zapytanie, jeśli wystąpił błąd - zależy jaki - ponów (max ilość prób, czy max czas w jakim powtarzać próbę, ewentualnie reconnect), może w przypadku pewnych błędów nie warto ponawaić zapytania, tylko użytkownikowi zwrócić błąd (np. jakiś błąd sql w składni zapytania etc.)
  • zwróc wynik
0

kolejny problem z aplikacją
użytkownik zgłasza, że aplikacja działała tydzień ok
a dzisiaj, nikt się do PC nie dotyka a aplikacja "znika z ekranu"
okazuje się, że zamyka się forma natomiast proces programu w menedżerze zadań jest..

czy możecie powiedzieć co może być przyczyną i gdzie ew. szukać (jak przechwycić) sytuację powodująca ww zachowanie

z góry dziękuję

0

Niestety nie odpowiem Ci na to pytanie, jednakże jeśli pojawiają się takie błędy raczej ciężko będzie Ci go znaleźć. Spróbuj zainteresować się jakąś biblioteką jak NLog, czy wbudowanymi klasami w c# do tracowania aplikacji i w razie czego niech pakuje i wysyła gdzieś (email, ftp) plik z logiem.

0

IMHO coś jest narąbane w wątkach bądź muteksach.

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