Witam,
Napisałem mój pierwszy większy program(w C#), który korzysta z bazy SQL'a. Mam pewien problem. Pierwsze połączenie z bazą zawsze trwa do 10 sekund, i jest to bardzo uciążliwe. Każde kolejne, trwa ułamek sekundy, więc nawet trudno to zauważyć. I tak jest przy każdym uruchomieniu komputera. Jeżeli połączę się pierwszy raz(ten długi raz) i komputera nie wyłączę przez np. 6 godzin, to program będzie się szybko łączył szybko przez te 6 godzin, aż do czasu kiedy go uruchomię ponownie. Wtedy znowu pierwsze połączenie trwa do 10 sekund, i każde kolejne ułamek sekundy. Wie ktoś może, co zrobić w tej sytuacji? Co może być tego powodem?
Z góry dziękuję, pozdrawiam.
być może usługi bazy danych są uruchamiane w momencie pierwszego połączenia.
Uruchom sobie services.msc (przez start uruchom), poszukaj czegoś w stylu MSSQLSERVER i zobacz jak tam jest: Automatic czy Manual, jak manual to jest tak właśnie jak myślę.
Jak przestawisz na automatic to będzie Ci się uruchamiać przy starcie systemu-czyli serwer bazy będzie działał zawsze, spowalniał komputer przy starcie itp. Ocen co Ci się bardziej opłaca
Jeśli usługa serwera jest wyłączona, to program nie powinien się połączyć.
No, chyba że jest w nim kod sprawdzający czy usługa jest włączona i ew. uruchamiający ją, ale nigdy się z czymś takim nie spotkałem.
Jest tam ustawione tak jak być powinno. Dodam, że dzieje się tak na dowolnym komputerze na jakim włączam program ;/ . Jakieś inne sugestie?
tak :)
pooling - sprawdz czy masz wlaczony.
Jesli nie to obiekty dostepowe sa tworzone a nie pobierane
Do connection stringa dorzucam "Pooling=True", ale jest bez zmian. Dałem też w connectionstringbuilderze pooling na true, ale dalej to samo. Ogólnie mój connection string wygląda tak: connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\dbPlanZajec.mdf;Integrated Security=True;User Instance=True"
Może to coś komuś podpowie.
A tu z desperacji kod mojej klasy którą używam do łączenia z bazą i pobierania tabelek.
#region Zmienne
private string conStr = ConfigurationManager.ConnectionStrings["PlanZajecSQL"].ConnectionString; //"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\dbPlanZajec.mdf;Integrated Security=True;User Instance=True"; ConfigurationManager.ConnectionStrings["PlanZajecSQL"].ConnectionString;
private SqlDataAdapter dAdapt = null;
SqlCommandBuilder builder = null;
private string tabelaName;
#endregion
#region Metody
/// <summary>
/// Konfiguruje adapter(?). Dla kontruktora.
/// </summary>
private void ConfigureAdapter()
{
SqlConnectionStringBuilder strBuilder = new SqlConnectionStringBuilder(conStr);
strBuilder.ConnectTimeout = 20;
dAdapt = new SqlDataAdapter("Select * From " + tabelaName, strBuilder.ConnectionString);
builder = new SqlCommandBuilder(dAdapt);
}
/// <summary>
/// Czyta tabelę.
/// </summary>
public DataTable GetTable()
{
DataTable tab = new DataTable(tabelaName);
dAdapt.Fill(tab);
return tab;
}
/// <summary>
/// Uaktualnia tabelę.
/// </summary>
public void UpdateTable(DataTable modifiedTable)
{
builder.GetUpdateCommand();
dAdapt.Update(modifiedTable);
}
#endregion
#region Konstruktory
public DbService(string tabelaName_)
{
tabelaName = tabelaName_;
ConfigureAdapter();
}
#endregion
Z tego co pamiętam, to przy pierwszym zapytaniu do bazy (chyba przy zapytanieu, a nie połączeniu) ADO odczytuje wszystkie informacje dotyczące GetSchema. Jeśli masz dużo obiektów, to będzie to długo trwać. A jeśli jeszcze pierwsze zapytanie będzie długotrwałe, to już zupełny koszmar... Dlatego sswego czasu od razu po połączeniu dawałem zapytanie typu SELECT 1
nie podoba mi sie ten conect string.
Wygeneruj go za pomoca ODBC
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.