Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam.
Tak się zastanawiam, mając taki kod:
try { DodajCośDoBazy(); ZróbCoś() }
jak najlepiej obronić się przed zostawianiem syfu w bazie? Czy dobrym rozwiązaniem jest wyrzucenie wszystkiego co operuje na bazach na zasadzie:
try { var dodane = DodajCośDoBazy();//w samej metodzie nic nie zapisuj; ZróbCoś() baza.DodajObiekt(dodane); baza.ZapiszZmiany(); }
Czy jest jakiś lepszy sposób? To powyższe wydaje się jakieś takie "bee". ;]
Offline
najlepiej zrobić sobie modele bazy (ORM) a nastepnie wykonujesz tylko metode save() np:
UserModel user = new UserModel(); user.login = "login"; user.password = "tajne jaslo"; user.email = "stefek@lala.pl"; user.save();
i masz po zamiatany syf :)
a jak sobie dobrze opiszesz model to mozesz wycignac owego usera:
UserModel user = UserModel("stefek@lala.pl"); form.name.value = user.name; form.lastname.value = user.lastname;
no :)
PSy 1:
z reszta jaki model zrobisz to takie metody bedziesz mial, i przez to najlepiej uzywac frameworkow w javie np. hibernate
Offline
@jezoo:
Model oczywiście jest - jako że obecnie robię na C# to jest generowany za pomocą EntityToSql. Tyle że pytanie jest czy lepiej wszelkie metody dodające coś do modelu tworzyć tak aby realnie same w sobie nie modyfikowały bazy, np:
public DataModel InsertData() { DataModel dataModel = new DataModel(); return dataModel; }
I potem w kodzie używać w stylu:
try { var dataModel = InsertData(); database.InsertData(dataModel); database.SaveChanges();//W przypadku Entity dopiero tutaj dane lądują w bazie }
Plusem powyższego wydaje się być fakt że w przypadku wyjątku żadne syfy nie powinny wpaść do bazy (o ile dobrze patrzę ;] ). Tyle że wydaje mi się że powyższa konstrukcja jest trochę "bee" z punktu widzenia estetyki. Stad pytanie czy jest na to jakiś lepszy wzorzec :)
Offline
Troche lekturki http://pl.wikipedia.org/wiki/Data_Access_Object , poszukaj na google "wzorce dostępu do danych". Poczytaj cokolwiek, sie skupiasz na jakiejś estetyce kilku linijek, które niewiele mówią. Po co jakieś insertData, które robi new DataModel(), to nie lepiej var dataModel = new DataModel() od razu? I nazwa metody kiepsko dobrana, ta metoda ma wsadzać dane? Gdzie? Do DataModel? A potem jakiś obiekt database który też ma inserData? ;] Co robi insertData z database skoro dopiero save changes zapisuje, czyli robi insert data? To jakiaś pseudo obsługa transakcji? Serio byś coś poczytał, a nie filozofujesz na oślep ;] I jak C# to nie pisz, że Java czy C++. Poczytaj czego w C# ludzie używają do utrwalania. Jak chcesz prostą aplikacje to pewnie zwykłe wywoływanie zapytań wystarczy z obsługą błędów i być może transakcje jak potrzebujesz. Jak coś ciekawszego to jakiś ORM, może NHibernate w takim razie.
Offline
@kamikaze, czym różni się NHibernate od Hibernate ? :)
Offline
NHibernate jest dla C# a Hibernate dla Javy
Jeśli korzystasz z hibernate to polecam spiąć go razem ze Spring Framework :)
Dobrze jest też korzystać z transakcji przy operacjach na bazie.
Offline
[quote=Huk]jak najlepiej obronić się przed zostawianiem syfu w bazie? Czy dobrym rozwiązaniem jest wyrzucenie wszystkiego co operuje na bazach na zasadzie:
try { var dodane = DodajCośDoBazy();//w samej metodzie nic nie zapisuj; ZróbCoś() baza.DodajObiekt(dodane); baza.ZapiszZmiany(); }
Czy jest jakiś lepszy sposób? To powyższe wydaje się jakieś takie "bee". ;][/quote]
Najlepszy sposób to sprawdzenie poprawności danych przez próbą zapisu, najlepiej w warstwie interfejsu, bo tam się wprowadza dane. Interfejs, który pozwala wpisać dane niezgodne ze schematem jest zły. Każdy dobry ORM też sprawdza zgodność danych ze schematem przed dostępem do bazy, a poleganie na silniku bazy w celu sprawdzania czy nie będzie bałaganu jest nieeleganckie i obciąża niepotrzebnie bazę. Natomiast wyjątkami lepiej się posługiwać przy usuwaniu danych. Kiedy jest dużo danych w bazie to szybciej będzie wyłapać wyjątek wygenerowany przez dobrze zaprojektowany schemat (więzy integralności) niż sprawdzanie w X tabelach czy jakieś dane są używane.
Transakcje także są dobre, ale jak ze wszystkim [url=http://msdn.microsoft.com/en-us/library/ff647793.aspx#scalenetchapt14%20_topic9]powinno się przy ich stosowaniu przestrzegać pewnych reguł[/url].
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00099 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.117.172.189' WHERE u.id=1 |
0.00085 | UPDATE punbb_online SET logged=1732222064 WHERE ident='18.117.172.189' |
0.00040 | SELECT * FROM punbb_online WHERE logged<1732221764 |
0.00077 | DELETE FROM punbb_online WHERE ident='3.145.108.43' |
0.00083 | DELETE FROM punbb_online WHERE ident='54.36.148.132' |
0.00059 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=22984 AND t.moved_to IS NULL |
0.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00186 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=22984 ORDER BY p.id LIMIT 0,25 |
0.00074 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=22984 |
Total query time: 0.00725 s |