You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java EE开发中如何清理服务器缓存?GlassFish场景技术求助

这个问题我太熟了!很多用GlassFish+EclipseLink做Java EE开发的朋友都踩过这个坑——手动改了数据库数据,应用却死活读不到,非得重新部署才行,核心就是双层缓存在搞事情:GlassFish的服务器缓存,加上EclipseLink的JPA二级缓存。下面一步步帮你解决:

一、先清空GlassFish的服务器缓存

这是最直接的临时解决方法,能快速验证是不是服务器缓存的问题:

  • 先停掉GlassFish服务器:不管你是用NetBeans的服务器控制台,还是命令行执行asadmin stop-domain,一定要确保服务完全停止,不然缓存文件被占用删不掉。
  • 找到缓存目录:默认情况下,缓存文件在GlassFish的域目录里,路径大概是:
    • 你的GlassFish安装路径/glassfish/domains/你的域名/generated
    • 你的GlassFish安装路径/glassfish/domains/你的域名/cache
      比如默认域名是domain1的话,就是glassfish/domains/domain1/generated和cache这两个文件夹。
  • 删除缓存内容:把这两个文件夹里的所有文件和子文件夹删掉(别删文件夹本身),这些都是自动生成的缓存文件,重启服务器会自动重建。
  • 重启GlassFish:启动服务器后再测试,手动修改的数据库数据应该能被应用读到了。不过这只是临时方案,要彻底解决,还得调整EclipseLink的缓存配置。
二、调整EclipseLink的JPA缓存(从根源解决)

EclipseLink默认会开启二级共享缓存,把实体数据存在内存里,避免频繁查数据库。但手动改数据库后,缓存里的数据不会自动同步,所以得针对性配置:

1. 开发阶段全局禁用二级缓存

如果是开发测试阶段,追求数据实时性,直接在persistence.xml里全局禁用共享缓存:

<persistence-unit name="YourPU" transaction-type="JTA">
    <!-- 其他配置 -->
    <properties>
        <!-- 全局禁用所有实体的共享缓存 -->
        <property name="eclipselink.cache.shared.default" value="false"/>
    </properties>
</persistence-unit>

这样每次查询都会直接访问数据库,开发时很方便,但生产环境不建议用,会影响性能。

2. 针对特定实体禁用缓存

如果只是个别实体需要实时数据,其他实体要保留缓存性能,可以在实体类上加@Cacheable(false)注解:

@Cacheable(false)
@Entity
public class YourEntity {
    // 实体字段和方法
}

3. 手动刷新缓存(适合生产环境)

生产环境需要缓存提升性能,但有时候需要主动刷新数据,可以在EJB里注入EntityManager,调用刷新方法:

@Stateless
public class YourBusinessEJB {
    @PersistenceContext
    private EntityManager em;

    // 刷新单个实体对象
    public void refreshSingleEntity(YourEntity entity) {
        em.refresh(entity);
    }

    // 清空某个实体类的全部缓存
    public void clearEntityCache() {
        em.getEntityManagerFactory().getCache().evict(YourEntity.class);
    }

    // 清空所有实体的缓存
    public void clearAllCache() {
        em.getEntityManagerFactory().getCache().evictAll();
    }
}

比如在手动修改数据库后,调用这个EJB的方法刷新缓存,就能拿到最新数据了。

4. 配置缓存自动过期

给缓存设置过期时间,让它定期自动刷新,比如设置5分钟过期:

<persistence-unit name="YourPU" transaction-type="JTA">
    <!-- 其他配置 -->
    <properties>
        <property name="eclipselink.cache.type.default" value="SoftWeak"/>
        <!-- 过期时间300000毫秒=5分钟 -->
        <property name="eclipselink.cache.expiry.default" value="300000"/>
    </properties>
</persistence-unit>

这样既保留了缓存的性能优势,又能保证数据不会太旧。

三、NetBeans里的快捷操作(可选)

如果你用NetBeans开发,其实可以直接在“服务”面板里找到GlassFish服务器,右键选择Clean and Build,然后重新部署应用。这个操作会自动清理服务器缓存和项目编译缓存,效果和手动删缓存差不多,适合开发时快速验证。

内容的提问来源于stack exchange,提问作者magicien22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:07