Весенняя проблема транзакций с tomcat, mysql и eclipselink - PullRequest
0 голосов
/ 22 октября 2011

У меня много путаницы после поиска в Google для весенних транзакций с eclipselink, tomcat и mysql.Пожалуйста, рассмотрите следующие вопросы и направьте меня по этой теме.

  1. Могу ли я запустить весенние транзакции с eclipseLink, tomcat и mysql enviornment?если да, то как конфиг?я использовал следующую конфигурацию и всегда получаю исключения блокировки.

Persistence.xml:

<persistence-unit name="xxxxService" transaction-type="RESOURCE_LOCAL">
  <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
  <class>...</class>
  <class>...</class>
  <class>...</class>
  <properties> .... </properties>
</persistence-unit>

Spring-beans.xml:

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"
        id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="jpaDialect" ref="jpaDialect" />
    </bean>
    <bean id="jpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
        <property name="showSql" value="true" />
        <property name="generateDdl" value="true" />
    <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" />
    </bean>
    <bean
        class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"
        id="entityManagerFactory">
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <property name="jpaDialect" ref="jpaDialect" />
        <property name="persistenceUnitName" value="xxxxService" />
    </bean>     

    <tx:annotation-driven transaction-manager="transactionManager" />

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

Класс JAVA:

  @Transactional
public void saveSumthg(Sumthg sumthg) throws Exception{
    someDAO.saveSumthg(sumthg);
}

   @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public List<Sumthg> findActiveSumthgs(String username) {
    List<Sumthg> sumthgs = someDAO.findActiveSumthgs(username);
    return sumthgs ;
}

Я что-то здесь не так делаю?Я не уверен, что обработка транзакций Spring работает правильно с tomcat, так как я не использую транзакции JTA.

  1. С EclipseLInk и mysql стратегия генерации идентификаторов идет с таблицей последовательности и в таблице только одна строкаобновляется для всех транзакций.Я подозреваю, что это вызывает проблемы с блокировкой.Я прав?Если так, как я могу избежать этого?

Конфигурация генерации идентификатора в классе домена выглядит следующим образом:

@Id
@Column(name = "some_id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

В схеме mysql создается новая таблица с именем SEQUENCE изначение хранится в нем.Я думаю, каждый раз, когда вставляется строка, отсюда берется идентификатор.Поскольку одно и то же значение читается и обновляется, я подозреваю, что это может вызвать проблемы с блокировкой.Если я прав, как я могу избежать этой проблемы ??

Ждем ваших ответов.

Спасибо.

получил обновление - я вижу следующие журналы:

Internal Exception: java.sql.SQLException: Lock wait timeout exceeded; try restarting
transaction
Error Code: 1205
Call: UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
   bind => [50, SEQ_GEN]
Query: DataModifyQuery(name="SEQUENCE" sql="UPDATE SEQUENCE SET SEQ_COUNT = 
SEQ_COUNT   + ? WHERE SEQ_NAME = ?")]

Итак, ясно, что это происходит, потому что одно и то же значение в таблице SEQUENCE изменяется несколькими потоками.Какова лучшая стратегия генерации идентификаторов, которую я могу использовать в этом контексте ??

Ответы [ 2 ]

0 голосов
/ 31 июля 2012

Я не вижу, как вы могли бы получить исключения блокировки всегда.Вы используете несколько потоков / клиентов?Попробуйте установить запись в журнале наилучшим образом, чтобы увидеть, что происходит.

EclipseLink обычно выделяет идентификаторы последовательности вне транзакции, поэтому обычно не имеет каких-либо конфликтов блокировки.Вы также можете включить пул последовательных соединений в EclipseLink, который всегда будет использовать отдельное соединение для распределения идентификаторов, чтобы избежать любых конфликтов блокировок.

0 голосов
/ 28 июля 2012

Проблема в том, что вы используете наихудшее параллельное решение ID GENERATION (TABLE_SECUENCE).В этом случае лучшим решением будет использование ПОСЛЕДОВАТЕЛЬНОСТИ ПОКОЛЕНИЯ.

Секвенсоры намного лучше справляются с параллелизмом.

...