У меня много путаницы после поиска в Google для весенних транзакций с eclipselink, tomcat и mysql.Пожалуйста, рассмотрите следующие вопросы и направьте меня по этой теме.
- Могу ли я запустить весенние транзакции с 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.
- С 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 изменяется несколькими потоками.Какова лучшая стратегия генерации идентификаторов, которую я могу использовать в этом контексте ??