Конфигурация Spring JTA TransactionManager: Поддержка и Tomcat и JBoss

Размер структуры больше, чем сумма ее частей из-за того, что называется упаковкой. У конкретного процессора есть предпочтительный размер данных, с которым он работает. Большинство современных процессоров предпочитают размер, если 32 бит (4 байта). Доступ к памяти, когда данные находятся на этом типе границы, более эффективен, чем те, которые охватывают эту границу размера.

Например. Рассмотрим простую структуру:

struct myStruct
{
   int a;
   char b;
   int c;
} data;

Если машина является 32-разрядной машиной, а данные выровнены по 32-битной границе, мы видим немедленную проблему (при отсутствии выравнивания структуры). В этом примере предположим, что данные структуры начинаются с адреса 1024 (0x400 - обратите внимание, что младшие 2 бита равны нулю, поэтому данные выравниваются с 32-разрядной границей). Доступ к data.a будет работать нормально, потому что он начинается на границе - 0x400. Доступ к data.b также будет работать нормально, поскольку он находится по адресу 0x404 - еще одна 32-разрядная граница. Но неуравновешенная структура поставит data.c по адресу 0x405. 4 байта данных.c находятся в 0x405, 0x406, 0x407, 0x408. На 32-битной машине система считывала data.c в течение одного цикла памяти, но получала бы только 3 из 4 байтов (четвертый байт находится на следующей границе). Таким образом, системе потребуется второй доступ к памяти для получения 4-го байта,

Теперь, если вместо того, чтобы поместить data.c по адресу 0x405, компилятор заполнил структуру на 3 байта и поместил данные. c по адресу 0x408, тогда системе потребуется всего 1 цикл, чтобы прочитать данные, сократив время доступа к этому элементу данных на 50%. Заполняет эффективность памяти для эффективности обработки. Учитывая, что компьютеры могут иметь огромные объемы памяти (много гигабайт), компиляторы считают, что своп (скорость над размером) является разумным.

К сожалению, эта проблема становится убийцей при попытке отправить структуры по сети или даже записать двоичные данные в двоичный файл. Прокладка, вставленная между элементами структуры или класса, может нарушить данные, отправленные в файл или сеть. Чтобы написать переносимый код (тот, который будет использоваться для нескольких разных компиляторов), вам, вероятно, придется обращаться к каждому элементу структуры отдельно, чтобы обеспечить надлежащую «упаковку».

С другой стороны, разные компиляторы имеют разные возможности для управления упаковкой структуры данных. Например, в Visual C / C ++ компилятор поддерживает команду #pragma pack. Это позволит вам настроить упаковку и выравнивание данных.

Например:

#pragma pack 1
struct MyStruct
{
    int a;
    char b;
    int c;
    short d;
} myData;

I = sizeof(myData);

Теперь я должен иметь длину 11. Без прагмы я мог бы быть чем угодно из 11 до 14 (а для некоторых систем - до 32), в зависимости от стандартной упаковки компилятора.

10
задан Henning 22 September 2008 в 21:27
поделиться

4 ответа

Я думаю, что Вы упустили суть JNDI. JNDI был в значительной степени записан для решения проблемы, которую Вы имеете!

Я думаю, что можно взять его уровень, таким образом, вместо того, чтобы использовать "userTransaction" или "transactionManager от JNDI" в зависимости от ситуации. Почему бы не добавить "JtaTransactionManager" к JNDI. Тем путем Вы продвигаете конфигурацию к JNDI, где это, как предполагается, вместо того, чтобы создать еще больше конфигурационных файлов [как достаточно уже нет ;)].

14
ответ дан 3 December 2019 в 17:22
поделиться

Можно использовать PropertyConfigurerPlaceholder для введения ссылок на компоненты, а также простых значений.

Например, при вызове бобов 'jotm' и 'jboss' затем, Вы могли бы ввести свой ТМ как:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE">
    <property name="location" value="classpath:/path/to/application.properties"/>
</bean>
<bean id="jotm">...</bean>
<bean id="jboss">...</bean>
<bean id="bean-requiring-transaction-manager">
    <property name="transactionManager" ref="${transaction.strategy}"/>
</bean>

Затем можно подкачать использование менеджеров транзакций

  • транзакция strategy=jotm в файле свойств
  • - Dtransaction.strategy=jotm как системное свойство

Это - один возможный подход. См. мой блог для более полного примера.

Надеюсь, это поможет.

4
ответ дан 3 December 2019 в 17:22
поделиться

При использовании Spring 2.5, можно использовать <tx:jta-менеджер-транзакций/>. Я не использовал его с JBoss, но это должно работать на Вас согласно разделу 9,8 определенной для сервера приложений интеграции из справочника Spring.

2
ответ дан 3 December 2019 в 17:22
поделиться

<tx:jta-transaction-manager/> подход будет искать менеджер транзакций в нескольких местоположениях по умолчанию, перечисленных здесь. Если Ваш менеджер транзакций JBoss не находится в одном из тех местоположений, я предлагаю, чтобы Вы переместили его, если это возможно, или переместили его в Tomcat так, чтобы оба контейнера имели свой ТМ в том же месте JNDI.

2
ответ дан 3 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: