1

我是 Java 世界的新手(春季休眠等)。我正在为集群环境的缓存实现做 PoC。我只是想减少数据库中的命中,因此希望将数据库对象存储在缓存中。我从互联网上了解到,我需要使用 JPA 结合 ehcache 和 terracotta 服务器(BigMemory Max)来使用跨国缓存。Ehcache 可以很容易地识别一些跨国管理库,所以我使用了 atomikos。如果我走错了路,请纠正我。我有下面的代码来实现这一点,但我在管理工具中看到 0 个缓存对象。

1) ehcache.xml

<cache name="com.example.pocehcache.model.Note"
 maxEntriesLocalHeap="500"
 eternal="false"
 copyOnRead="true"
 copyOnWrite="true"
 transactionalMode="xa">
 <persistence strategy="distributed"/>
 <terracotta consistency="strong"/>
</cache>
<terracottaConfig url="localhost:9510" />

2) Application.properties

# application.properties
spring.cache.ehcache.config=classpath:ehcache.xml
com.atomikos.icatch.threaded_2pc=false
spring.jpa.open-in-view=true


## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=system
spring.datasource.password=password
spring.datasource.driver-class-oracle.jdbc.driver.OracleDriver


## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect


# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto=create-drop


server.port = 8090

3)控制器类(取自互联网样本)

@RestController
@RequestMapping("/api")
public class NoteController {


 @Autowired
 NoteRepository noteRepository;


 // Get All Notes
 @GetMapping("/notes")
 @Transactional
 public List<Note> getAllNotes() {
 List<Note> notes = noteRepository.findAll();
 return notes;
 }


 // Create a new Note
 @PostMapping("/notes")
 @Transactional
 public Note createNote(@Valid @RequestBody Note note) {
 return noteRepository.save(note);
 }


...

4) 应用类

@SpringBootApplication
@EnableJpaAuditing
@EnableAutoConfiguration
@EnableCaching
public class PocEhcacheApplication {
 public static void main(String[] args) {
 SpringApplication.run(PocEhcacheApplication.class, args);
}

5) 模型(带有 setter、getter、equals 和 hashCode 方法)

    @Entity
    @Table(name = "notes")
    @EntityListeners(AuditingEntityListener.class)
    @JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, 
     allowGetters = true)
    public class Note implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;


     @NotBlank
     private String title;


     @NotBlank
     private String content;


     @Column(nullable = false, updatable = false)
     @Temporal(TemporalType.TIMESTAMP)
     @CreatedDate
     private Date createdAt;


     @Column(nullable = false)
     @Temporal(TemporalType.TIMESTAMP)
     @LastModifiedDate
     private Date updatedAt;
    ...

6) Terracotta 管理控制台 o Terracotta 管理控制台缓存中的对象

任何帮助或指示将是一个很好的支持。我在类路径中使用 BigMemory Max-4.3.4.3.15 和相关的 jar 应用程序。如果需要任何其他信息,请告诉我。

注意:如果我将对象直接放入 BigMemory,它可以工作(bigMemory.put(new Element(note.getId(), note)))。我可以看到兵马俑控制台中的物体数量。

非常感谢!

4

0 回答 0