více instancí dibi – napojení na dva servery

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
drakul
Člen | 37
+
0
-

Zdravím, řeším problém, jak se připojit k více databázovým serverům současně pomocí dibi. Dibi, pokud se nemýlím, je návrhový vzor Singleton. Takže mě napadá řešení:

  1. připojit se na první server dibi::connect($config_server_one), provést sadu příkazů a pak se přepojit na druhý server dibi::connect($config_server_two) a zde provést druhou sadu. Bohužel bych ale potřeboval často i přístup k oběma serverům najednou / napřeskáčku, takže bych tohle „přepojení“ řešil několikrát během běhu aplikace. Nenapadá někoho ladnější způsob?
  2. napadlo mě vytvořit dvě instance dibi_one a dibi_two … ale nevím jestli to je programátorsky „čisté“ a jestli to vůbec lze?

Díky moc za odpovědi.

Filip Procházka
Moderator | 4668
+
0
-
  1. tohle neni dibi fórum
  2. dibi umí držet libovolný počet připojení a metoda dibi::connect() vraci to připojeni
$pripojeniJedna = dibi::connect($udaje, 'jedna');
$pripojeniDva = dibi::connect($udaje, 'dva');

Není to moc pěkné. Co takhle se na statickou obálku vykašlat?

$pripojeniJedna = new DibiConnection($udaje);
$pripojeniDva = new DibiConnection($udaje);

To vypadá mnohem lépe. Píšeš na Nette fórum, takže předpokládám, že používáš Nette. Co takhle z toho udělat služby?

db1:
	username: foo
	password: bar

db2:
	username: foo
	password: bar

services:
	db1:
		class: DibiConnection
		arguments: ['%db1%']

	db2:
		class: DibiConnection
		arguments: ['%db2%']

Super! A teď je můžeš volat v presenterech.

$result = $this->context->db1->query('SELECT * FORM');
foreach ($result ...
	$this->context->db2->query('INSERT INTO ... ', $row);

Dobré, že? :)

drakul
Člen | 37
+
0
-

Super, díky moc, přesně tohle jsem potřeboval :-) Začínám mít Nette čím dál tím víc rád :)

fojta
Člen | 24
+
0
-

@HosipLan: a v Doctrine 2 to jde udělat taky ?

drakul
Člen | 37
+
0
-

Tak přecijen ještě jeden problém. Kam s umístěním „variables“ db1 a db2 ?
Protože když je nastavím do „development < common:“, tak mi to hází chybu:

Unknown environment variable 'db1'.

A když to zkusím hodit pod common: variable :, tak mi to píše:

Environment variable 'db1' is not scalar.

Díky za radu

Filip Procházka
Moderator | 4668
+
0
-

@**fojta**: Ano, ale chci vidět blázna, který by potřeboval dvě instance Doctrine.

@**drakul**: Musíš je odsadit, neboli dát před ně tabulátor, aby „patřily do sekce“.

Editoval HosipLan (10. 8. 2011 16:09)

fojta
Člen | 24
+
0
-

@HosipLan: No ale pokud bude potřebovat pracovat s více než jednou databázi tak to bude nejspíše potřeba. Jedině při potřebě druhe databáze zrušit instanci a vytvořit novou pro druhou DB, ale to je pěkná prasarna.

Editoval fojta (10. 8. 2011 16:57)

drakul
Člen | 37
+
0
-

Problém vyřešen přechodem na nejnovější verzi Nette z GITu (čímž se ovšem objevilo 200 nových problémů, což je ale vedlejší :-D ).
Ještě bych se rád zeptal, jak budu k servisům přistovat z modelu (přecijen více použiju napojení na db v modelech než presenterech).
Díky za odpověď

Filip Procházka
Moderator | 4668
+
0
-

Na to ti asi nejjednodušeji odpoví https://pla.nette.org/…cy-injection