Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][PDO] Połączenie dopiero kiedy potrzebne, Połączenie z bazą danych dopiero kiedy jest naprawdę potrzebne
favik
post 20.02.2012, 18:04:23
Post #1





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


Witam,
poszukuje dodatku do PDO umożliwiającego łączenie się z bazą danych dopiero gdy jest ono naprawdę potrzebne i jakieś dane się faktycznie pobierze (podobno ma coś takiego Doctrine).
Ogólnie chcę zastosować cache wygenerowanego html'a (i tu wykorzystuje cache w Smarty) i cache zapytań do bazy danych (np na podstawie cache Nospora, który wykorzystać chce np w zapytań ajax'owych, do których nie będę już zaprzęgał Smarty), a co za tym idzie wielokrotnie nawet takie samo połączenie z bazą będzie niepotrzebne.

Dodatkowo taki dodatek mógłby liczyć ilość wykonanych zapytań do bazy czy czas ich wykonywania.

W obiektówce jestem początkujący. Gdy taką nakładkę zrobię przez dziedziczenie połączenie będzie nawiązywane automatycznie i tak kiedy utworzę klasę pochodną?
Aby moja klasa przypuśćmy myPDO, aby działała tak jak chce musiała by zawierać wszystkie metody takie jak PDO i w momencie wykorzystania którejś z nich od razu najpierw sprawdzała by czy połączenie już istnieje i jeśli nie najpierw je tworzyła.
Pytanie czy mój tok myślenia jest dobry? Może coś takiego już istnieje tylko nie znalazłem? Doctrine nie wiem czy jest sens tutaj wykożystywać, a co najważniejsze uczyć go się dla tego celu? Może jakiś inny sposób?

Pozdrawiam !
Go to the top of the page
+Quote Post
Crozin
post 20.02.2012, 18:36:30
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Doctrine DBAL (nie mylić z ORM-em)?
Go to the top of the page
+Quote Post
favik
post 20.02.2012, 21:15:44
Post #3





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


Z tego co przejrzałem, Doctrine DBAL chyba nie wprowadza dużych zmian co do kożystania z samego PDO, reszta metod wygląda identycznie poza kilkoma nowymi?

1. Rozumiem, że obiekt PDO też będzie tworzony dopiero gdy będzie potrzebne pobranie danych z bazy, a więc jak bym tego nie robił w takim przypadku nie wystąpią błędy przy przekazaniu obiektu pdo?

  1. class User {
  2. protected $pdo;
  3.  
  4. public function __construct(PDO $pdo) {
  5. $this->pdo = $pdo;
  6. }
  7.  
  8. ...
  9.  
  10. }


2. Jak z używaniem cache? Nie mogę sie doszukać. Chyba już w tym przypadku potrzebował bym całego ORM?
3. Może jakieś inne pomysły jak OPD?
Go to the top of the page
+Quote Post
Crozin
post 20.02.2012, 23:53:45
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. Jeżeli przekazujesz "czysty" obiekt PDO to nie masz żadnej dodatkowej kontroli nad jego działaniem. Musiałbyś przekazywać obiekt Doctrine\DBAL\Connection.
2. Doctrine'owski DBAL to jedynie warstwa abstrakcji nad połączeniem z bazą danych realizowanym przez PDO - tak więc cache dla wyników zapytań nie leży w gestii tego narzędzia.
Go to the top of the page
+Quote Post
by_ikar
post 21.02.2012, 08:35:56
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Tworzysz instancje PDO dopiero wtedy kiedy wykonujesz jakieś zapytanie, poprzez swoją nakładkę, dopiero kiedy takie zapytanie zostanie przekazane, tj twój obiekt zostanie gdzieś wykorzystany, dopiero zanim przekazane zostanie zapytanie do PDO, dopiero wtedy sprawdzasz czy istnieje instancja PDO. A taki przykładowy kod mógłby wyglądać tak:

  1. <?php
  2.  
  3.  
  4. class Database
  5. {
  6. protected $connection = null;
  7. protected $dsn;
  8. protected $username;
  9. protected $password;
  10. protected $driver_options;
  11.  
  12. public function __construct($dsn, $username = null, $password = null, array $driver_options = array())
  13. {
  14. $this->dsn = $dsn;
  15. $this->username = $username;
  16. $this->password = $password;
  17. $this->driver_options = $driver_options;
  18. }
  19.  
  20. public function connect()
  21. {
  22. $this->connection = new PDO($this->dsn, $$this->username, $this->password, $this->driver_options);
  23. }
  24.  
  25. public function query($sql)
  26. {
  27. if(null === $this->connection)
  28. {
  29. $this->connect();
  30. }
  31.  
  32. return $this->connection->query($sql);
  33. }
  34. }


IMO nie wiem po co ci tworzyć połączenie dopiero jak jest potrzebne. Połączenie z bazą danych nie wiele cię kosztuje, jeżeli chodzi o zasoby, także nie wiem skąd takie pomysły wink.gif
Go to the top of the page
+Quote Post
Crozin
post 21.02.2012, 08:55:34
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@by_ikar: Bo połączenie z bazą danych jest kosztowne. Powinno się jeszcze nadpisać: beginTransaction(), exec(), getAttribute(), getAvailableDrivers(), inTransaction(), prepare(), quote(), setAttribute(), a w przypadku innych wyrzucić wyjątek.
Go to the top of the page
+Quote Post
by_ikar
post 21.02.2012, 09:01:19
Post #7





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


Tak tak, wiem, to jest przykład, o czym wspomniałem. Kosztowne może i jest, ale czy aż tak bardzo? W specyficznych miejscach może to być przydatne, na średnich lotów stronie, nie wydaje mi się aby to było jakoś specjalnie przydatne.. Aczkolwiek fakt, jest to jakaś opcja w miejscach gdzie nie operujemy danymi z bazy i ta baza jest nam zbędna. Hmm, w swojej "nakładce" na PDO, akurat dziedziczę PDO, żeby właśnie nie przepisywać tych wszystkich metod, ale sam się nad takim wyjściem zastanowię..
Go to the top of the page
+Quote Post
favik
post 21.02.2012, 13:17:17
Post #8





Grupa: Zarejestrowani
Postów: 58
Pomógł: 0
Dołączył: 18.05.2010

Ostrzeżenie: (0%)
-----


@by_ikar: Dokładnie o coś takiego mi chodziło, mówiąc o rozszerzeniu PDO. Zachowa swoją budowę, a jedynym "problemem" będzie nadpisanie każdej metody w PDO metodą o takiej samej nazwie w mojej klasie.

Jednak dużo czytałem i w wielu miejscach polecają Doctrine. Jednak mam takie pytanie. Skrypt chciał bym zoptymalizować pod serwer wirtualny i czy cache z doctrine będzie dostępne na takim serwerze? W grę wchodzi tutaj chyba jedynie standardowe cache na plikach? Czy na doctrine to osiągnę (w dokumentacji mowa jest o: APC, XCache, memcache)?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 07:14