java - 以编程方式设置锁定超时 Spring Boot JPA

标签 java spring spring-boot spring-data-jpa

我有

@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 文件设置超时值。我见过一些在传递给 EntityManagerfind 方法的属性中设置 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/

相关文章:

java - 创建另一个进程的 HWND 的子窗口? (例如屏保预览)

java - Spring 测试 - @ContextConfiguration 无法加载资源

spring - spring 中的单例模式和应用范围模式有什么区别?

mysql - Spring Boot Jpa - 如何将实体更新到 mysql 数据库

java - 如何计算与 Web 应用程序代码相关的 selenium 测试的代码覆盖率

java - Cursor,CursorAdapter,LoaderManager,Loader之间的关系

java - 自动连线注释在自定义推土机转换器内不起作用

java - 如何在 Spring Boot 中禁用或覆盖 RequestCacheAwareFilter

java.text.ParseException : Unparseable date: "01-02-2014" 异常

java - 由于属性文件位置类型,应用程序或集成测试 Spring 上下文创建失败