代码之家  ›  专栏  ›  技术社区  ›  Lahiru Chandima

当堆缓存大小配置为MB时,Ehcache的非法反射访问警告

  •  0
  • Lahiru Chandima  · 技术社区  · 3 年前

    我使用Ehcache作为hibernate的查询缓存,下面是我的Ehcache配置。

    <cache alias="default-query-results-region">
        <key-type>org.hibernate.cache.spi.QueryKey</key-type>
        <value-type>java.lang.Object</value-type>
        <expiry>
            <ttl unit="seconds">30</ttl>
        </expiry>
        <resources>
            <heap unit="MB">1</heap>
            <offheap unit="MB">2</offheap>
        </resources>
    </cache>
    

    当我执行应用程序时,控制台会记录以下警告。

    WARNING: An illegal reflective access operation has occurred
    WARNING: Illegal reflective access by org.ehcache.sizeof.ObjectGraphWalker (file:/C:/Users/<my_username>/.m2/repository/org/ehcache/ehcache/3.9.4/ehcache-3.9.4.jar) to field java.util.ArrayList.elementData
    WARNING: Please consider reporting this to the maintainers of org.ehcache.sizeof.ObjectGraphWalker
    WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
    WARNING: All illegal access operations will be denied in a future release
    

    但是如果我将堆单元指定为 entries .

    <heap unit="entries">2</heap>
    

    下面是我正在使用的Ehcache版本。

    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>3.9.4</version>
    </dependency>
    

    下面是我的hibernate配置,其中我指定了Ehcache作为缓存提供程序。

    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.jcache.JCacheRegionFactory</property>
    <property name="hibernate.javax.cache.provider">org.ehcache.jsr107.EhcacheCachingProvider</property>
    <property name="hibernate.javax.cache.uri">ehcache.xml</property>
    

    我正在使用 OpenJDK 11 .

    这一警告的原因是什么?我有什么办法可以修吗?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Christian Beikov    3 年前

    如果按物理大小(即MB)约束缓存,EHCache必须以某种方式探测所有数据结构,以确定其实际大小(以字节为单位)。要做到这一点,它必须“分解”所有类以确定大小。您可以使用以下java命令行标志来允许EHCache(但不幸的是,也允许所有其他代码)执行此操作: --add-opens=java.base/java.util=ALL-UNNAMED

    java.base 模块,这取决于缓存项中使用的数据结构类型。这个解决方案带来的一个特殊的“安全问题”是,您运行的任何其他代码现在都可以完成Java9开始封装以提高安全性的所有事情。若要将此“权限”仅限于EHCache,您必须在模块模式下运行,尽管我不确定您想要做什么。