Бавни XA транзакции в JBoss

Работим с jboss 4.2.2 със SQL сървър 2005 (sqljdbc драйвер 1.2).

Наскоро инсталирахме нова реликва и можем да видим голямо затруднение с нашите транзакции.

Обикновено за всяка една уеб заявка тясното място на седи на едно от следните:

  • master..xp_sqljdbc_xa_start
  • master..xp_sqljdbc_xa_commit
  • org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection()
  • master..xp_sqljdbc_xa_end

За един от тези елементи се изразходват няколкостотин ms (в някои случаи няколко секунди). Кумулативно по-голямата част от времето за отговор се изразходва за тези елементи.

Опитвам се да установя дали е някое от следните:

  • Ще помогне ли преместването от XA транзакции?
  • Има ли по-голям проблем в моята база данни, за който нямам видимост?
  • Мога ли да надстроя своя SQL драйвер, за да помогна с това?
  • Или това е индикация, че просто има много заявки и трябва да започнем, като разгледаме нашия код и се опитаме да намалим общия брой заявки?

person Dominic    schedule 04.01.2013    source източник


Отговори (1)


XA транзакциите са необходими, ако извършвате работа срещу повече от един ресурс в една транзакция, ако имате нужда от последователност, тогава имате нужда от XA. Все пак вие говорите от гледна точка на „заявки“, което може да означава, че извършвате предимно дейности само за четене, така че XA може да е пресилено. Освен това не говорите за използване на множество бази данни или други транзакционни ресурси, така че наистина ли имате нужда от XA?

И така, първа стъпка: разберете изискванията, имате ли нужда от обхват на транзакция, който обхваща няколко взаимодействия с база данни? Ако правите само една заявка, XA не е необходим. Ако имате комбинация от дейности, които се нуждаят от XA, и прости заявки, които не се нуждаят от XA, тогава използвайте две различни връзки, една с XA и една без - това изяснява вашето намерение. Въпреки това бих очаквал XA драйверите да използват оптимизации на единичен ресурс, така че ако XA не е необходим, да не плащате режийните разходи, така че подозирам, че тук се случва нещо повече. (отказ от отговорност Не използвам JBoss, така че интуицията ми е подозрителна).

Така че вижте дали обхватите на вашите транзакции са подходящи, нивата на изолация са разумни и т.н. Получавате ли спорове, защото транзакциите са неоправдано дълги, например дали транзакциите се държат за време за мислене на потребителя?

След това тези многосекундни чакания: това предполага съперничество (или някакъв странен мрежов проблем). Единствената причина, за която мога да се сетя, че xa_start е бавен, е, че писането на регистър на транзакциите отнема неоправдано дълго време - може би вашите регистрационни файлове са на някакво бавно мрежово устройство? Waits for getConnection() може просто да означава, че вашият пул от връзки е твърде малък (или държите връзки твърде дълго) Ако xa_commit и xa_end отнемат много време, бих искал да знам какво правят мениджърите на ресурси, можете ли вземете всякаква информация от сървъра на базата данни.

Моята обща позиция: Ако наистина имате нужда от XA, тогава ще платите някои режийни разходи за регистриране и мрежови съобщения, но те не трябва да ви струват стотици или хиляди милисекунди. Повечето бизнес системи се нуждаят от XA в малко подмножество от общия си достъп до ресурси, обикновено при актуализиране на две иначе независими системи и почти никога в сценарии само за четене - абсолютната последователност в разпределените системи е почти безсмислена, така че използването на XA за заявки е почти сигурно пресилено.

person djna    schedule 04.01.2013