首页 > 解决方案 > Spring Framework bean 初始化未从数据库返回正确的数据

问题描述

我正在使用 java 更新 Spring 应用程序中的 DAO bean。当DAO被初始化时,初始化方法(InitDao)访问一个Oracle数据库并从一个表中返回4行数据。该类缓存数据,当应用程序在消息处理期间需要数据时,它会使用缓存的数据,除非上次访问时间超过 15 分钟之前。当我第一次运行应用程序时,数据已正确返回。我更新了数据库中的数据,应用程序从不使用新数据。如果我用新版本重新部署应用程序,即使在初始化期间,数据也是原始数据。缓存永远不会更新。缓存时间设置并在 15 分钟后更新。查询数据库的方法也会运行。然而数据并没有改变。

我是这个框架的新手,所以我不完全确定 bean 是如何初始化的以及该过程是如何工作的。但这就是我所知道的。

我以这种方式更新了定义 bean 的 xml 文件:

<bean id="applicationControlDao"         
   class="tms.common.repository.appControl.cache.dao.ApplicationControlDao">
   <property name="dataSource">
        <ref bean="dataSource" />
   </property>
   <property name="applications">
        <value>TRIPMESSAGINGSERVICE</value>
    </property>
</bean>

这是初始化方法。

public void initDao() throws Exception {
        this.selectApplicationControlQuery = new ApplicationControlDao.SelectApplicationControlQuery(this.getDataSource(), "select application, appl_parm_key, parameter from tms_application_control where application = ?");
        this.applicationControlDtos = this.querySelectApplicationControl(this.selectApplicationControlQuery, this.applications);
        this.resetExpiration();
        this.lastCacheRefreshTime = GregorianCalendar.getInstance();
    }

这是在应用程序中更新缓存的方式:

public boolean isParameterFlagYes(String parameterKey) {
        String[] application = {MessageServiceConstants.APPLICATION_NAME};
        log.info("Last refresh time: " + applicationControlDao.getLastRefreshTime());
        List<IApplicationControlDTO> applicationControlDtoList =  applicationControlDao.selectApplicationControl(application);
        for(IApplicationControlDTO appControls : applicationControlDtoList)
        {
            log.info("App Control Parameter Key: " + appControls.getParamKey() + " Parameter Value: " + appControls.getParameter());
        }
        Optional<IApplicationControlDTO> applicationControlDto = applicationControlDtoList.stream().
                filter(p -> p.getParamKey().equals(parameterKey) &&
                        p.getParameter().equalsIgnoreCase(CoreConstants.YES_FLAG)).findAny();
        if (applicationControlDto.isPresent()) {
            log.info("App Control Flag is true for " + parameterKey );
            return true;
        }
        log.info("App Control Flag is false for " + parameterKey );
        return false;
    }

为什么不清除缓存并更新数据?我还尝试调用作为 ApplicationControlDAO 一部分的“resetCache”方法,并且数据库值不会更改。它们是我第一次运行应用程序时的原始值。

谢谢

标签: javaspring-framework-beans

解决方案


推荐阅读