Chúng tôi có một mô hình thực thể mở rộng với hơn 100 lớp thực thể. Tất cả các lớp thực thể là các lớp con của một siêu thực thể đơn. Chế độ bộ nhớ cache dùng chung đã được đặt thành TẤT CẢ.Vùng bộ nhớ cache chuyên dụng cho các lớp con thực thể?
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "entities")
public abstract class LongIdEntity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Version
@Column(name = "OPT_LOCK_VERSION")
private Long lockVersion;
etc...
}
Một ví dụ lớp con:
@Entity
@Table(name = "cars")
public class Car extends LongIdEntity { ... }
Chúng tôi muốn bộ nhớ cache tất cả các đơn vị trong bộ nhớ cache cấp 2. Vấn đề là chỉ có 1 vùng nhớ đệm được tạo cho tất cả các thực thể; có tên là LongIdEntity.
Các chương trình gỡ lỗi Hibernate đã làm tìm tất cả các lớp thực thể, nhưng vẫn gán chúng cùng một vùng. Bởi vì tại SessionFactoryImpl: 339:
String cacheRegionName = cacheRegionPrefix + model.getRootClass().getCacheRegionName();
Trong trường hợp của chúng tôi, các cuộc gọi đến model.getRootClass() sẽ luôn mang lại "LongIdEntity".
Tôi cho rằng điều này thực sự sẽ lưu tất cả các thực thể, nhưng không có bất kỳ sự kiểm soát nào về việc trục xuất. Một số lớp học rất thường xuyên và chỉ đọc. Vì vậy, chúng tôi muốn giữ chúng gắn vào bộ nhớ. Một số thường được sử dụng trong một khoảng thời gian nhất định, vv ... Cramming tất cả vào cùng một bộ nhớ cache invalidates tất cả.
Chỉ định khu vực trong chú thích không có hiệu lực. Ví dụ:
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,region = "cars")
@Entity
@Table(name = "cars")
public class Car extends LongIdEntity { ... }
Điều lạ là chỉ chia sẻ chế độ bộ nhớ cache ALL nhặt các lớp thực thể. Trong bất kỳ chế độ nào khác, không có thực thể nào - ngay cả khi được chú thích bằng @Cache và/hoặc @Cacheable. Có lẽ đây là một dấu hiệu?
Ai đó có ý tưởng về cách tôi có thể chỉ định các lớp thực thể cụ thể cho các vùng cụ thể?
TIA :-)
persistence.xml là tiểu:
nhà máy<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="cars" transaction-type="RESOURCE_LOCAL">
<shared-cache-mode>ALL</shared-cache-mode>
</persistence-unit>
</persistence>
Phiên họp được thực hiện theo cách cổ điển:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
<property name="persistenceUnitName" value="optimus"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.default_cache_concurrency_strategy">NONSTRICT_READ_WRITE</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">1000</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.search.default.directory_provider">filesystem</prop>
<prop key="hibernate.search.default.indexBase">/hibernate-search</prop>
</props>
</property>
</bean>
Môi trường
- JDK6
- Linux x64
- Hibernate 4.1.10
- mùa xuân 3.2.1
UPDATE: Sử dụng @MappedSuperclass
@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class LongIdEntity { ... }
Không thay đổi điều gì cả.
Bạn có thể kiểm tra xem [câu hỏi này] (http://stackoverflow.com/questions/4452242/specifying-global-ehcache-capacity) không giải quyết cùng một vấn đề với sự cố bạn đang gặp phải không? – mindas
Tôi đang cố gắng để đối diện thực sự. Anh ấy đang cố gắng để có một bộ nhớ cache lớn và tôi đang cố gắng để có một bộ nhớ cache cho mỗi thực thể. Hoặc ghi đè hành vi này bằng @Cache (region = ....). Nó được sử dụng để làm việc theo cách đó trong ngày đầu, nhưng ngày nay nó bị bỏ qua. –