sterowniki sqlsrv spowalniają kodowanie?

Zainstalowałem najnowszą wersję CI 2.1.3

Teraz po uruchomieniu zapytania otrzymuję bardzo wolny czas odpowiedzi na coś bardzo prostego, takiego jak:

function Bash(){


    $sql = “SELECT * FROM Contacts”;
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
  die( print_r( sqlsrv_errors(), true) );
}

po wysłaniu zapytania do zdalnej bazy danych. (Serwer SQL 2008)

Kiedy uruchamiam to samo zapytanie w prostym skrypcie PHP na tej samej zdalnej bazie danych. Otrzymuję wyniki natychmiast.

a) Czy ktoś inny doświadczył tego problemu ze sterownikami sqlsrv w kreatorze kodu?

Jeśli tak, jak go rozwiązałeś?

Oto mój ciąg połączenia:

$db['default']['hostname'] = "xxxxx,1433";
$db['default']['username'] = "xx";
$db['default']['password'] = "xxxxxx-xx";
$db['default']['database'] = "xxxxxxxxx";
$db['default']['dbdriver'] = "sqlsrv";
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = TRUE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

AKTUALIZACJA:

Po uruchomieniu profilera znalazłem następujące elementy.

BAZA DANYCH: baza danych QUERIES: 1 (Ukryj) 0.0659 wybierz * z Kontaktów

Czas ładowania: Klasy podstawowe 0.0428 Czas wykonania kontrolera (Welcome / AzureBash) 58.2173 Całkowity czas wykonania 58.2602

Wydaje się, że zapytanie wykonuje się w ciągu 0,06 sekundy, ale kontroler ładuje się przez minutę.

Nie mam pojęcia, dlaczego tak się dzieje.

Rozwiązanie

Interfejs aktywnych rekordów dla najnowszych sterowników SQLSRV jest błędny.

Pobierz i nadpisuj istniejący interfejs za pomocą tych plików (nadpisz folder sqlsrv w folderze bazy danych w CI):

http://www.kaweb.co.uk/blog/mssql-server-2005-and-codeigniter/

Uwaga: zostały przetestowane z SQL Azure i działają.

$ query-> num_rows (); nie działa z tymi sterownikami, więc radzę zamiast tego użyć licznika. Lub utwórz własne opakowanie.

Ponadto data jest teraz typem obiektu daty w zestawie wyników.

Mam nadzieję, że to pomoże.

Rozwiązanie 2

Jeśli z jakiegoś powodu znajdziesz błąd, który czyni go całkowicie bezużytecznym. Przywróć pierwotnie dostarczony interfejs sqlsrv. Przekonasz się, że przyczyną problemu jest sposób, w jaki oryginalny interfejs wykonuje zapytanie, dlatego utwórz klasę pomocnika bazy danych; użyj $ sql = $ this-> db-> last_query (); aby uzyskać zapytanie, które miałeś wykonać, a następnie w klasie database_helper wykonaj je samodzielnie:

function MakeDbCall ($sql)
{
$serverName = "xxxxx-xxxx-xxx,1433"; //serverName\instanceName
$connectionInfo = array( "Database"=>"xxx", "UID"=>"xx", "PWD"=>"xxxxx","ConnectionPooling" => "1");



 $conn = sqlsrv_connect($serverName,$connectionInfo);
 $stmt = sqlsrv_query($conn, $sql);

 while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
      $result_array[] = $row;
}

return $result_array;

}

Utwórz jeden dla tablicy_wiersz.

Powinieneś być w stanie wywołać tę funkcję bezpośrednio z dowolnego miejsca w aplikacji. Korzystając ze sposobu, w jaki active_records konstruuje zapytanie.

Nie jest to idealne rozwiązanie, ale dopóki codeigniter nie posortuje swojej klasy SQLSRV, niewiele możemy zrobić.

questionAnswers(5)

yourAnswerToTheQuestion