Java әзірлеушісіне арналған db4o нұсқаулығы: транзакциялар, бөлінген қол жеткізу және қауіпсіздік

Новости мира

Топтаманың алдыңғы мақалаларында мен db4o жүйесінде нысанға бағытталған деректермен манипуляциялау негіздерін қарастырдым. Мен назардан тыс қалдырған мәселелердің бірі — веб-қосымшаларда OODBMS пайдалану және оның Swing немесе SWT қолданбаларында пайдаланудан айырмашылығы. Кейбіреулер мен кез келген .NET немесе Java әзірлеушісі білуі керек мәселелердің тұтас спектрін елемедім деп айтуы мүмкін.

Мен OODBMS-тің ең тартымды мүмкіндіктеріне назар аударғым келді: объектіге бағытталған сақтау, манипуляция және деректерді іздеу. Сонымен қатар, OODBMS жеткізушілері транзакцияны басқару және қауіпсіздік сияқты негізгі функцияларды іске асыруға бейім, RDBMS-ге ұқсас, бірдей кең ауқымды опцияларды қамтамасыз етеді.

Бұл мақалада, db4o Java әзірлеуші ​​​​нұсқаулығы сериясының соңғы бөлігі, мен кез келген деректерді сақтау жүйесінде болуы керек мүмкіндіктерді қарастырамын, ол нысанға бағытталған, қатынастық немесе басқа. Терең тыныс алыңыз және db4o жүйесінде қауіпсіздік, бөлінген қолжетімділік және транзакция туралы естуге дайын болыңыз.

Бірнеше қосылымдарды қолдау

Барлық алдыңғы бөліктердің мысалдарында деректер қорымен тек бір клиенттік қосымша жұмыс істейді деп болжанған. Сондықтан бір ғана логикалық байланыс жеткілікті болады, ол арқылы барлық деректер алмасу өтеді. Бұл параметрлер дерекқорымен немесе жергілікті жадпен жұмыс істейтін Swing немесе SWT қолданбасы үшін өте орынды болжам. Бірақ бұл барлық деректер веб-көрсетілім деңгейінде сақталса да, веб-бағдарлама үшін әлдеқайда шынайы емес.

db4o ішінде дерекқорға қосымша логикалық қосылымды ашу, тіпті егер дерекқор жергілікті дискіде орналасқан болса да, маңызды емес тапсырма болып табылады. Тек ObjectServer нысанын жасау және одан ObjectContainer сыныбының данасын алу қажет. ObjectServer нысанына 0 портындағы кіріс қосылымдарды тыңдауды айтсаңыз, ол «ендірілген» режимде жұмыс істейді. Осылайша, біздің жалған сынақта ол басқа қолданбаларға кедергі келтіруі мүмкін нақты TCP/IP порттарын ашпайды (1-тізім).

Листинг 1. Кірістірілген режимде бірнеше қосылымдар
@Test public void letsTryMultipleEmbeddedClientConnections()
{
ObjectServer сервері = Db4o.openServer («persons.data», 0);

тырысу
{
ObjectContainer client1 = server.openClient();
ted1 қызметкері = (қызметкер)
client1.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі();
System.out.println(«клиент1 табылды ted: » + ted1);

ObjectContainer client2 = server.openClient();
ted2 қызметкері = (қызметкер)
client2.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі();
System.out.println(«клиент2 табылды ted: » + ted2);

ted1.setTitle («Ием және Ең Жоғарғы Гуру»);
client1.set(ted1);
System.out.println(«set(ted1)»);

System.out.println(«клиент1 ted1 табылды: » +
client1.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі());

System.out.println(«клиент2 табылды ted2: » +
client2.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі());

client1.commit();
System.out.println(«client1.commit()»);

System.out.println(«клиент1 ted1 табылды: » +
client1.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі());

System.out.println(«клиент2 табылды ted2: » +
client2.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі());

client2.ext().refresh(ted2, 1);
System.out.println(«Клиент2.refresh() кейін»);
System.out.println(«клиент2 табылды ted2: » +
client2.get(
жаңа қызметкер («Тед», «Neward», null, null, 0, null))
.Келесі());

client1.close();
client2.close();
}
ақырында
{
server.close();
}
}

Мүмкіндік көрінісін жаңарту

Сынақ жағдайының ортасындағы отладтау шығыс сызықтарына назар аударыңыз. Нысандардың күйін үнемі бақылау өте маңызды, себебі db4o бұрын қол жеткізілген нысандарға сілтемелерді сақтайды. Бұл нысандарға өзгертулер қалай және қашан екінші клиентке көрінетінін нақты білуіңіз керек.

Мысалы, set(ted1) әдісін шақырғаннан кейін db4o ted1 нысанын «лас» деп белгілейді және оны жаңарту қажет. Бірақ ObjectContainer сыныбында commit() шақыру арқылы жасырын транзакция жасалмайынша жаңартудың өзі болмайды. Осы кезде деректер дискіге сақталады, бірақ клиент2 әлі де нысандардың алдыңғы күйін көреді. Демонстрациялық сынақ жағдайының жөндеу нәтижесін көру арқылы мұны тексеріңіз. Ақыр соңында, браузермен бірге сізде осы сериядағы мақалаларды оқу кезінде сынақтарды орындайтын консоль терезесі де бар, солай емес пе?

Бұл мәселені шешу оңай: клиент2 ext() әдісі арқылы алуға болатын кеңейтім нысанының refresh() әдісін шақыру арқылы объект графигінің жадтағы көрінісін жаңартуы керек. Бұл әрекетті орындаған кезде белсендіру тереңдігін есте сақтаңыз: ол нысандардың күйін жаңарту үшін db4o диаграммаға қаншалықты өту керектігін анықтайды. Біздің жағдайда біреуге тең тереңдік жеткілікті, бірақ тұтастай алғанда шешім нақты жағдайды ескере отырып қабылдануы керек.

client2 нысан көрінісі жаңартылған кезде өзгерістерді көреді. Мұны компания басшысының жаңа атын қайтаратын сұрауды орындау арқылы тексеру оңай (мүмкін, бұл аздап өзімшіл болып көрінуі мүмкін).