gpt4 book ai didi

spring - Spring Data JPA-返回 future

转载 作者:行者123 更新时间:2023-12-03 12:59:23 24 4
gpt4 key购买 nike

我试图保存我的实体异步并返回结果的 future ,但是我遇到了以下问题:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.Repository;
import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Repository;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;

// I must extend Repository because when I extended JpaRepository an argument
// of save is ambigous when I try save(countryEntity) - compiler shows me
// save (CountryEntity) in AsyncCountryRepository and save (S) in CrudRepository
public interface AsyncCountryRepository extends Repository<CountryEntity, Long> {

// I don't know why I cannot return Future<CountryEntity>
@Async
<S extends CountryEntity> Future<S> save(CountryEntity countryEntity);

// I cannot test it - test is below
@Async
CompletableFuture<CountryEntity> findByCode(String code);

}


@RunWith(SpringRunner.class)
@DataJpaTest
public class CountryRepositoryTest {

@Autowired
private TestEntityManager entityManager;

@Autowired
private AsyncCountryRepository countryRepository;

@Test
public void findByCodeTest() throws Exception {
// given
final CountryEntity countryEntity = new CountryEntity("EN");

final CountryEntity persisted = entityManager.persist(countryEntity);
entityManager.flush();

// when
final Future<CountryEntity> byCode = countryRepository.findByCode(persisted.getCode());

// then
assertThat(byCode.get())
.isEqualTo(persisted);
}

测试返回失败,我得到 expected:<CountryEntity(id=1, code=EN)> but was:<null>
如何将我的存储库实现为异步存储库以及如何对其进行测试?

哪种方法具有更好的性能:
1.从储备库退还 future
2.在ExecutorService中以Callable的身份运行存储库方法

最佳答案

如果使用@Async,则存储库代码将在其自身事务中的单独线程中运行。由于您的原始交易未提交,因此看不到更改(即插入的实体),因此没有null结果。

因此,为了使其正常工作,您需要提交第一笔交易。

关于性能的第二个问题(下次请另外回答):多线程代码的性能取决于很多事情,这实际上是回答它的唯一有用的方法:尝试一下。但是,如果您如何安排执行时间对性能的影响比对线程池和连接池大小的影响更大,我会感到惊讶。

关于spring - Spring Data JPA-返回 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46548804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com