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.
- Rejestracja:ponad 16 lat
- Ostatnio:6 miesięcy
- Postów:167
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
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

- Rejestracja:prawie 17 lat
- Ostatnio:2 dni
- Postów:2792
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