Witam grupe to moja pierwsza aktywnosc na forum i w spolecznosci railsowej ale mysle ze przygoda dopiero sie zaczyna…
Chcialem poruszyc troche temat metod tworzenia oprogramowania w railsach. Typowym (dla mnie przynajmniej) sposobem tworzenia aplikacji jest dodawanie po trochu funkcjonalnosci, testowanie i tak w kolko. Na koniec jakies szlify, wyrzucenie pomocniczych komunikatow itp
W railsach swietnie do tego nadaje sie tryb development ( nie ma wreszcie jakiegos glupiego re-deployowania aplikacji jak w jakims tam dziwnym jezyku ). Dobre jest to ze nastepuje wtedy przeladowanie wszystkich zrodel … no i tu sie robi problem - strasznie to niewydajne !
Do celow rozwojowych uzywam Apacha i railsow jako fcgi. Pracuje caly czas nad jedna strona (duzo interakcji ajaxowej, operacji na bazie danych itp)
Ta sama stronka w trybie production otwiera sie odrazu, w trybie development 15 sekund…
Pytanie jest jasne - w jaki inny sposob mozna tworzyc aplikacje aby moc ja sprawnie rozwijac i testowac?
Pozdrawiam
Tryb development jest zalecany do programowania, więc twoje podejście jest dobre
15 sekund oczekiwania na odpowiedź to “trochę” za długo. Normalnie w trybie development powinieneś mieć czas odpowiedzi 1-2 sekundy (góra). Sprawdź swoją konfigurację Apache’a. Sam mam doświadczenia w konfigurowaniu Lighttpd, z tego co pamiętam lighty reagował od razu na zapytanie w trybie development (fastcgi).
Napisz jakiego os-a używasz i w jaki sposób skonfigurowałeś ruby/sterowaniki do bazy/bazę/apache’a i chyba najważniejsze fastcgi, które potrafi przysporzyć kłopotów zanim zacznie działać normalnie na danej maszynie.
Mogę służyć pomocą w konfiguracji na Debianie/Gentoo, nie miałem okazji trenować ustawień Railsów na Windows/MacOS.
Możesz też sprawdzić czy Webrick ( ./script/server) działa szybciej w Twoim przypadku. Może się okazać, że Webrick Ci w zupełności wystarczy
Mysle ze problem lezy po stronie samego railsa a nie fcgi. Taki sam czas jest w przypadku webricka
W logu development mam :
Completed in 22.97300 (0 reqs/sec) | Rendering: 19.34700 (84%) | DB: 0.52200 (2%) | 200 OK [http://localhost/grafik/edytuj_osobe?wg_id=63.0]
Tak wiec sam rails przetwarza tyle czasu - czy moze to byc kwestia polaczenia z baza ? z tego co wiem to w tym przypadku za kazdym razem nastepuje nowe polaczenie z baza - moze to jest przyczyna ? Lacze sie z Oraclem 10g na localhoscie - moze samo polaczenie tyle zajmuje ?
Konfiguracja to niestety winda XP + apache fcgi
Czy da sie jakos ustawic zeby dokladnij sie przyjrzec co on robil te 19.34 sek ?
Czy da sie zmusic railsa zeby utrzymywal polaczenie z baza ?
Zlokalizowalem juz chyba przyczyne…
Otoz dosc dlugo wykonuje sie u mnie na bazie zapytanie o kolumny tabeli:
select column_name, data_type, data_default, nullable,
decode(data_type, ‘NUMBER’, data_precision,
‘VARCHAR2’, data_length,
null) as length,
decode(data_type, ‘NUMBER’, data_scale, null) as scale
from user_catalog cat, user_synonyms syn, all_tab_columns col
where cat.table_name = ‘NTIME_GRAFIK’
and syn.synonym_name (+)= cat.table_name
and col.table_name = nvl(syn.table_name, cat.table_name)
and col.owner = nvl(syn.table_owner, user)
Wykonuje sie okolo 2-3 sekundy
Poniewaz rails wywouje je dla kazdego modelu - daje to w tej chwili okolo 7 zapytan
Optymalnie byloby wiec ustawic railsa tak aby cachowal klasy modeli , a nie cachowal kontrolera i widoku… szukam jak to zrobic
Pozdrw
Znalazłem coś takiego:
Umieść poniższy kod w config/environments/development.rb i daj znać czy pomogło. Nie znam się niestety na Oraclu, żeby zaproponować coś od siebie.
[code=“ruby”] module ActiveRecord
module ConnectionAdapters
class OCIAdapter < AbstractAdapter
def columns(table_name, name = nil)
table_cols = <<-SQL_CODE
select column_name, data_type, data_default,
nullable,
decode(data_type, ‘NUMBER’, data_precision,
‘VARCHAR2’,
data_length, null) as length,
decode(data_type, ‘NUMBER’, data_scale, null) as
scale
from user_synonyms syn
join all_tab_columns col on syn.table_name =
col.table_name
where syn.table_name = #{table_name.to_s.upcase}
and col.owner = nvl(syn.table_owner, user) }
SQL_CODE
select_all(table_cols, name).map do |row|
row['data_default'].sub!(/^'(.*)'\s*$/, '\1') if
row['data_default']
OCIColumn.new(
oci_downcase(row['column_name']),
row['data_default'],
row['data_type'],
row['length'],
row['scale'],
row['nullable'] == 'Y')
end
end
end
end
end[/code]
Jeszcze jedno, możesz wyłączyć cache’owanie dla klas w environments/development.rb
[code=“ruby”]# In the development environment your application’s code is reloaded on
every request. This slows down response time but is perfect for development
since you don’t have to restart the webserver when you make code changes.
config.cache_classes = false[/code]
ale to jest raczej bezużyteczne podczas kodowania, bo musiałbyś po każdej zmianie w kodzie przeładowywać serwer. Nie wiem jak wyłączyć tylko cacheowanie struktury bazy.
Dzieki wielkie, naprowadziles mnie gdzie szukac bledu.
Poprawilem wiec troche kod odpowiedzialny za pobieranie nazw kolumn, tak zeby nie szukal po synonimach itp ( na mojej bazie akurat moge to zastosowac )
Mysle ze przy nastepnych wersjach sterownika do Oracla dokonaja jakis optymalizacji
Completed in 0.90100 (1 reqs/sec) | Rendering: 0.39000 (43%) | DB: 0.35100 (38%) | 200 OK [http://localhost/grafik/edytuj_osobe?wg_id=63.0]
Pozdrawiam!