我是 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)))。我可以看到兵马俑控制台中的物体数量。
非常感谢!