Размер структуры больше, чем сумма ее частей из-за того, что называется упаковкой. У конкретного процессора есть предпочтительный размер данных, с которым он работает. Большинство современных процессоров предпочитают размер, если 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), в зависимости от стандартной упаковки компилятора.
Я думаю, что Вы упустили суть JNDI. JNDI был в значительной степени записан для решения проблемы, которую Вы имеете!
Я думаю, что можно взять его уровень, таким образом, вместо того, чтобы использовать "userTransaction" или "transactionManager от JNDI" в зависимости от ситуации. Почему бы не добавить "JtaTransactionManager" к JNDI. Тем путем Вы продвигаете конфигурацию к JNDI, где это, как предполагается, вместо того, чтобы создать еще больше конфигурационных файлов [как достаточно уже нет ;)].
Можно использовать 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>
Затем можно подкачать использование менеджеров транзакций
Это - один возможный подход. См. мой блог для более полного примера.
Надеюсь, это поможет.
При использовании Spring 2.5, можно использовать <tx:jta-менеджер-транзакций/>. Я не использовал его с JBoss, но это должно работать на Вас согласно разделу 9,8 определенной для сервера приложений интеграции из справочника Spring.
<tx:jta-transaction-manager/>
подход будет искать менеджер транзакций в нескольких местоположениях по умолчанию, перечисленных здесь. Если Ваш менеджер транзакций JBoss не находится в одном из тех местоположений, я предлагаю, чтобы Вы переместили его, если это возможно, или переместили его в Tomcat так, чтобы оба контейнера имели свой ТМ в том же месте JNDI.