Spring @Transactional объединяет и сохраняет вопрос

Векторы являются массивами под капотом. Производительность является тем же.

Одно место, где можно столкнуться с проблемой производительности, не измеряет вектор правильно для начала.

, Поскольку вектор заполняется, он изменит размеры себя, и это может подразумевать, новое распределение массива, сопровождаемый n копируют конструкторов, сопровождаемых приблизительно n вызовы деструктора, сопровождаемый массивом удаляют.

, Если Ваш создавать/разрушать является дорогим, Вы - очень более обеспеченное создание вектора корректный размер для начала.

существует простой способ продемонстрировать это. Создайте простой класс, который показывает, когда он создан/уничтожен/скопирован/присвоен. Создайте вектор этих вещей и начните продвигать их на бэкэнде вектора. Когда вектор заполнится, будет каскад действия, поскольку вектор изменяет размеры. Тогда попробуйте его снова вектором, измеренным к ожидаемому числу элементов. Вы будете видеть различие.

5
задан thirdy 18 October 2009 в 04:06
поделиться

2 ответа

Этот вопрос SO является хорошим обсуждением сохранения и слияния, и принятый ответ довольно хорошо это объясняет. Другой ответ также ссылается на хорошее сообщение в блоге об этом.

Согласно первому ответу в , это другое сообщение , похоже, можно было бы вызвать слияние как для сохранения, так и для обновления объекта, но я сделал это не так. В моих приложениях Spring / JPA я просто использую DAO, расширяющие JpaDaoSupport, и использую getJpaTemplate () следующим образом.

/**
 * Save a new Album.
 */
public Album save(Album album) {
    getJpaTemplate().persist(album);
    return album;
}

/**
 * Update an existing Album.
 */
public Album update(Album album) {
    return getJpaTemplate().merge(album);
}
5
ответ дан 14 December 2019 в 01:11
поделиться

Ссылка на другой вопрос SO, заданный Калебом, действительно хорошо справляется с описанием различий и подводных камней persist () vs merge (). Однако я всегда просто реализовывал свои классы Dao с помощью одного метода save (), который вызывает только merge () для обработки как вставок, так и обновлений, и я никогда не сталкивался ни с одним из подводных камней persist () vs merge ().

Что касается производительности и транзакционных методов: Использование @Transactional в методах, которые являются только операциями чтения, на самом деле не повлияет на производительность, хотя я предпочитаю использовать аннотации на уровне методов, чтобы легко определить, какие методы являются обновленными, а какие - читаемыми. Вы можете сделать это, установив атрибут readOnly в аннотации @Transactional .

Если вы следуете соглашению об именах в своих методах (т.е. любой метод чтения всегда начинается с getXXX ), вы также можете использовать синтаксис poincut в файле конфигурации Spring, чтобы автоматически делать это различие:

  <tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
      <tx:method name="get*" read-only="true"/>
      <tx:method name="*"/>
    </tx:attributes>
  </tx:advice>

Подробнее см. документацию Spring по транзакциям .

Также я обычно помещаю @Transactional атрибуты на один уровень выше моих классов Dao на уровне обслуживания.

4
ответ дан 14 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

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