我有
@Transactional(timeout = 600)
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerRepository customerRepository;
@Override
public void actOnCustomer(Long customerId) {
...
连同
public interface CustomerRepository extends CrudRepository<Customer, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Customer> findById(Long id);
客户行似乎被锁定,并且超时值似乎具有适当的效果。
现在我希望能够以编程方式和/或使用我的 application.properties 文件设置超时值。我见过一些在传递给 EntityManager
的 find
方法的属性中设置 javax.persistence.lock.timeout
的示例,但我不确定如何最好地将 EntityManager
调用合并到 Spring 存储库中,而且似乎应该有一种更 Spring 的方式(比如设置 spring.jpa.properties.javax.persistence.lock.timeout=600
application.properties,这似乎不起作用)。
那么我该怎么做呢?
最佳答案
我最终添加了
@Autowired
private Environment env;
@PostConstruct
public void configureJpaTransactionManager() {
((JpaTransactionManager) this.platformTransactionManager).setDefaultTimeout(
Integer.parseInt(env.getProperty("transaction.timeout", "3")));
}
到我的@SpringBootApplication
注释的主类,它似乎可以完成这项工作。不确定这是最好的方法。 (“transaction.timeout”是我编写的属性名称)。
关于java - 以编程方式设置锁定超时 Spring Boot JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231316/