Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

ZazaBlog

Firebird budiž pochválen

Před asi tak deseti lety jsem programoval jedno databázové řešení, které bylo založené na VB6 (znalci si jistě vzpomenou) a na Accessu. Z původně malé, embedded databáze se během vývoje vyklubalo něco, co mělo zvládat práci zhruba pěti, šesti uživatelů současně a databáze v některých tabulkách měla mít několik desítek tisíc řádků. Samozřejmě, že to v reále nefungovalo, na něco takového Access nebyl stavěný. Databáze padala jak švestky na podzim, projekt byl přepsán do MSSQL a já si zapsal za uši, že embedded databáze je sprostý výraz, který se v mojí přítomnosti nesmí vyslovovat.

Před nedávnem jsem opět dostal zakázku na řešení vyžadující vloženou databázi. Již delší dobu pošilhávám po tom, že vyzkouším Firebird, nuže vyzkoušel jsem, a tady jsou moje postřehy.

Instalace a zprovoznění

Nebudu dopodrobna popisovat, co je třeba udělat, pokud chcete k .NETovému projektu přibalit knihovny potřebné pro běh embedded verze Firebirdu, to už za mě udělali jiní. V zásadě jde o to přibalit k projektu jednak knihovny samotného firebirdu, a jednak knihovny ADO.NET data providera. Je ale fakt, že to skutečně funguje. Pokud někdo, stejně jako já, používá pro instalaci vynikající InnoSetup, postačí do skriptu dopsat něco ve smyslu:

Source: fbclient.dll; DestDir: {app}
Source: icudt30.dll; DestDir: {app}
Source: icuin30.dll; DestDir: {app}
Source: icuuc30.dll; DestDir: {app}
Source: intl\fbintl.conf; DestDir: {app}\intl
Source: intl\fbintl.dll; DestDir: {app}\intl
Source: FirebirdSql.Data.FirebirdClient.dll; DestDir: {app}

Firebird má 32bitové i 64bitové verze, takže nepoplést. Dále je třeba v projektu mít nějakou tu databázi. Ta se dá buď přibalit vytvořená, nebo vytvořit pomocí příkazu:

FbConnection.CreateDatabase(connectionString)

A pokud potřebujete ze skriptu vygenerovat nějaké databázové objekty, tak Vám poslouží objekt FBScript

Dim sc As FbScript = New FbScript(Obsah)

sc.Parse()

Dim fbe As FbBatchExecution = New FbBatchExecution(conn)

For Each xcmd As String In sc.Results

fbe.SqlStatements.Add(xcmd)

Next

fbe.Execute()

Co Firebird umí

Asi by bylo jednodušší popsat, co neumí, ale nic mě nenapadá. Má pohledy, uložené procedury, spouště, cizí klíče, generátory … prostě všechno, co si budete přát. Navíc, embedded verze není nijak okleštěná oproti “velkému” Firebirdu. A killer feature – pokud se Vám projekt rozroste, prostě vyměníte connectionstring a namísto “malé” databáze použijete databázový server. V aplikaci jinak není třeba upravovat nic.

Reálný provoz

Co mě ale dostalo, je absolutní pohoda při práci s tímto řešením. Vytvořil jsem zátěžové testy, naspal jsem do embedded databáze desítky megabajtů dat a ono to stále fungovalo. Fungovalo to všude od Windows 98 po Windows seven, a celkem konzistentní byl i výkon. Jediná věc, na kterou jsem narazil byla ta, že opakované select dotazy je z hlediska výkonu lepší přepsat do uložených procedur. Ale to platí pro jakoukoli databázi.

Z nějakého důvodu jsem potřeboval pracovat s BLOBy, rovněž naprostá pohoda. Existuje dokonce názor, že práce s Firebirdem je v tomto ohledu výkonnější než práce s filesystémem. Nevím, nezkoušel jsem.

Co mě štve

Abych jen nepěl chválu – existují i nějaké maličkosti, na které při práci s Firebirdem narazíte. Já řešil třeba tohle:

  1. Internetové stránky http://www.firebirdsql.org/ vypadají jak z roku 1999.
  2. DDL je místy zkostnatělý a tvrdohlavý.
    alter table texty add popis varchar (200) not null default '';
    neprojde, ale
    alter table texty add popis varchar (200) default '' not null;
    projde. Jde o zvyk.
  3. Občas musíte hledat dokumentaci. Tak třeba z VB.NET získat hodnotu výstupního parametru z uložené procedury se mi podařilo až metodou pokus-omyl. Za to samozřejmě nemůžou ani tak vývojáři firebirdu, jako spíš vývojáři ADo.NET pro firebird.
  4. Nevím, co použít na správu databáze. Zkouším IBExpert, ale management studio to není ;-) . Nevíte někdo o něčem lepším?
Zveřejněno Saturday, May 09, 2009 8:13 AM by xzajic

Komentář

 

atasoft napsal:

FB jsem nasadil do jedné apliakce, ale po roce provozu neuvěřitelně kynul datový soubor, i když jsem dělal DELETE starých vět. Navíc dokumentace k FB je vtip :-( Tak jsem to přehodil na MSSQL Embedded a nelituji.

Na správu dat jsem používal FLAMEROBIN, ale taky mi to ovládání nějak nesedlo.

FB má jedinou výhodu v multiplatformnosti, jinak nic :-(

May 9, 2009 9:23 AM
 

xzajic napsal:

Já dělám pravidelně compact podle návodu zde: http://firebird-vbnet.blogspot.com/2007/01/firebird-vbnet-database-backup-restore.html a problémy s kynutím datového souboru nemám, tak nevím. Je fakt, že rok mi to teda neběhá...

May 9, 2009 10:12 AM
 

jirka napsal:

Kynuti souboru ma jeddnoduchy duvod. Kdyz se neco smaze, misto se nevraci. Jen se oznaci jako volne. U DB se predpoklada, ze data budou pribyvat, takze proc pak zase zbytecne alokovat. Zmensit se to da jednoduse backup&restore, jak je napsano vyse.

May 9, 2009 10:31 AM
 

rob napsal:

I já použil FB Embedded. Zas tak růžový to tedy není. Minimálně to neumělo pracovat s databázovým souborem v případě, že je umístěn v adresáři s češtinou (to neumí ani plný FB Server). Musel jsem si opatchovat FB.NET.Clienta aby to chodilo alespoň v případě, že ve jménu budou znaky z CurrentEncoding. V případě, že by to byl plný Unicode tak IMHO nejede vlak. Nefunguje to ani v 2.5 beta s 2.5 klientem. Přitom pro FB Embedded je umístění C:\Data aplikací přímo nutností.

U Embeded databáze je backup/restore mimo mísu. To je např. i důvod proč je u embeded problém časem přejít na vyšší verzi - to se IMHO také dělá pomocí backup/restore. Jediným řešením je asi přibalit si k aplikaci také nějaké ty "FB tools" aby se taková věc dala provést.

May 9, 2009 10:46 AM
 

xzajic napsal:

To mě trochu děsí. Já vyzkoušel práci se souborem, který měl v názvu složky české znaky a fungovalo mi to, aspoň tedy na Vistách. A proč by měl být backup a restore mimo mísu? Mě to normálně funguje, navíc protože je řešení embedded, funguje mi dokonce i to, že vypnu spojení a soubor zazálohuju / obnovím fyzicky... ještě se v tom povrtám.

May 9, 2009 2:28 PM
 

rob napsal:

S tím backup/restore jsem to myslel tak, že FBEmbed obvykle není instalovaný na serveru, ale na desktopu u někoho kdo ani neví, že tam něco takového má. Tudíž backup/restore se musí realizovat "programově" pomocí spouštění externích .exe, které nejsou součástí FBEmbed, takže je tam musím nejprve doinstalovat z plného serveru a ještě pak řešit nějaké ErrorCode apod. Prostě je to neohrabané...

S tou češtinou to může záviset např. na Charset uvedeném v ConnectionStringu. Já používám UTF8 a dostanu něco jako "Cannot open database file C:\Data aplikac<ctverecek><ctverecek>\...".

May 9, 2009 5:57 PM
 

xzajic napsal:

Čeština: Chápu, já používám CP1250 a zdá se, že to funguje bez problémů. Zálohování řeším tak, že se při startu aplikace podívám na datum poslední zálohy a pokud je to "příliš dávno", tak provedu zálohu (uživatel o tom nemusí ani vědět, když by na to přišlo). Tu zálohu pochopitelně provedu na lokál, nicméně žádné externí nástroje k tomu opravdu nepotřebuji. Dále, v aplikaci mám přepínač --backup, který to celé spustí BEZ GUI, provede zálohu a tiše skončí. A do třetice, někdé mám kód, co si umí vytvořit naplánovanou úlohu do Windows. Takže toho bych se fakt nebál. Ono navíc to moje embedded řešení samozřejmě neobsahuje mission-critical data ;-)

May 9, 2009 6:11 PM
 

terrorix napsal:

Na spravu database firebird/interbase urcite odporucam product od EMS. http://sqlmanager.net/en/products/ibfb/manager, pouzivame obdobny product pre MSSQL a nevieme si to vynachvalit (az na niektore otravne bugy). Urcite odporucam. Maju aj neaku freeware verziu: EMS SQL Manager for InterBase/Firebird Freeware.

May 11, 2009 4:06 PM
 

xzajic napsal:

... to jsem nezal, určitě na to juknu. Díky moc za link.

May 11, 2009 5:38 PM
 

tazi napsal:

Pouzivame FB a je vetsinou do 1G. pro spravu take doporucuju EMS.

zajimava diskuse.

preve sem se rozhodoval zda pouzivat FB nebo MS SQL?

FB databaze se nam totiz v case spomaluje coz je velky problem a resime to prave backup+restore (naky problem s velkym poctem transakci). coz me prijde sileny reseni. chova se tak i MS SQL?

navic nelze delat backup+restore, kdyz se jedna o sitovou aplikaci a porad nekdo na tom vysi:o(.

co by ste doporucili pro (jednoduche) sitove aplikace (MS, FB) ? treba i s ohledem na instalaci a udrzbu.

May 25, 2009 6:16 PM
 

xzajic napsal:

Tak každá databáze se při velkém počtu transakcí zpomalí, to je dáno jejich povahou. U FB i MSSQL lze dělat backup za pochodu, restore nelze dělat za pochodu ani u jedné z nich. MSSQL Express je v podstatě bezúdržbový (dobře, asi je třeba udělat si nějaké skriptíky na zálohy, ale to je tak asi všechno).

May 25, 2009 6:48 PM
Neregistrovaní uživatele nemužou přidávat komentáře.
Powered by Community Server (Personal Edition), by Telligent Systems