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
相关产品推荐
相关产品推荐

