懒加载session-多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功

问题描述

多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功

最近写了一个多数据源的代码,结果在使用的过程中出现了在一个请求中(方法中)两个数据库交替使用的情况,最后情况是数据库切换不过来
并且在项目配置中有懒加载和OpenSessionInViewFilter

数据库一个为本地数据库一个为基金数据库
要做的事情就是在本地查询到基金代码接着再循环去基金库查询基金数据
中间报错为在本地数据库中查询不到某个表(其实是在基金库中)
controller层

 @RequestMapping(value = "/fundsmatch")
    public String fundsMatch(HttpServletRequest request, HttpServletResponse response){
        BtnHitsCount hits = olService.findByBtnNameAndPage("匹配理财方案", "我的页面");
        hits.setHits(hits.getHits()+1);
        olService.saveHits(hits);
        if (getAttributeFromSession(Constant.SESSION_KEY_CURRENTUSERID) == null) {
            return "login";
        }
        String openuid = "c8572f0f-dca3-4b63-aecd-2f32d5510ba3";
        Integer userId = (Integer)getAttributeFromSession(Constant.SESSION_KEY_CURRENTUSERID);
        -------------------在本地库取数据--------------------
        JoUser joUser = joUserService.find(userId);
        PortfolioMatch match = portfolioMatchService.findEntity(userId+"");
        List<FundsGroupBean> list = new ArrayList<FundsGroupBean>();
        if(joUser.getRisklevel()!=null&&match!=null&&match.getPlanId()!=null){
            ScoreStandard standard = scoreStandard.findEntity(match.getScoreId()+"");
            FundPortfolio fundPortfolio = match.getFundPortfolioId();
            String[] fundcodes = fundPortfolio.getFundcodes().split(",");
            for (int i = 0; i < fundcodes.length; i++) {
                FundsGroupBean fgb = new FundsGroupBean();
                try {
                --------------切换基金库取数据--------------
                    JSONObject json = JSONObject.fromObject(fundsNavService.findFundsInfo(fundcodes[i]));
                --------------切换基金库取数据--------------
                } catch (Exception e) {
                    e.printStackTrace();--------------在此报错--------------------
                }
                fgb.setFundCode(fundcodes[i]);
                list.add(fgb);
            }
            request.setAttribute("list", list);
            request.setAttribute("rates", fundPortfolio.getMinIncomeRate()+"~"+fundPortfolio.getMaxIncomeRate());
            request.setAttribute("risktest", 1);
            request.setAttribute("level", joUser.getRisklevel()+"   "+standard.getName());
        }else{
            return "redirect:/questionnaire/plan_questionnaire";
        }
        return "fundsmatch";
    }

基金server层内部代码

@Service
public class FundsNavServiceImpl implements FundsNavService {
    @Autowired
    FundsNavDao dao;
    public Map<String, Object> findNav(String fundcode, String day) {
        ContextHolder.setDbType(DBType.dataSource2);
        Map<String,Object> map = dao.findNav(fundcode, day);
        ContextHolder.clearDBType();
        return map;
    }

    public Map<String, Object> findFundsInfo(String fundcode) {
        ContextHolder.setDbType(DBType.dataSource2);
        Map<String,Object> retMap = new HashMap<String,Object>();
        retMap.put("fundinfo", dao.findFundsInfo(fundcode));
        ContextHolder.clearDBType();
        return retMap;
    }

    public Map<String, Object> searchFunds(String fundcode, String page,
            String rows) {
        ContextHolder.setDbType(DBType.dataSource2);
        Map<String,Object> retMap = new HashMap<String,Object>();
        retMap.put("fundList", dao.searchFunds(fundcode, page, rows));
        ContextHolder.clearDBType();
        return retMap;
    }
}

数据源枚举类

 package com.chy.dangaowm.util.fund;

public enum DBType {
    dataSource1,
    dataSource2
}

继承的AbstractRoutingDataSource类并且在spring中配置

 package com.chy.dangaowm.util.fund;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        DBType dbType = ContextHolder.getDBType();
        return dbType;
    }

}

基金库切换类

 package com.chy.dangaowm.util.fund;

public class ContextHolder {
        private static final ThreadLocal<Object> holder = new ThreadLocal<Object>();

        public static void setDbType(DBType dbType){
            holder.set(dbType);
        }

        public static DBType getDBType(){
            return (DBType)holder.get();
        }

        public static void clearDBType(){
            holder.remove();
        }

}

spring配置文件


    <!-- 配置dataSource1   进行save,update操作时连接这个数据库-->
    <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.slave.url}" />
        <property name="username" value="${jdbc.slave.username}" />
        <property name="password" value="${jdbc.slave.password}" />
        <property name="initialSize" value="${jdbc.initialSize}" />
        <property name="maxActive" value="${jdbc.maxActive}" />
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        <property name="minIdle" value="${jdbc.minIdle}" />
        <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
        <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
        <property name="validationQuery" value="${jdbc.validationQuery}" />
        <!-- <property name="validationQuery" value="select 1;" /> -->
    </bean>
    <!--配置dataSource1   进行select操作时连接这个数据库  -->
    <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.master.url}" />
        <property name="username" value="${jdbc.master.username}" />
        <property name="password" value="${jdbc.master.password}" />
        <property name="initialSize" value="${jdbc.initialSize}" />
        <property name="maxActive" value="${jdbc.maxActive}" />
        <property name="maxIdle" value="${jdbc.maxIdle}" />
        <property name="minIdle" value="${jdbc.minIdle}" />
        <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
        <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
        <property name="validationQuery" value="${jdbc.validationQuery}" />
        <!-- <property name="validationQuery" value="select 1;" /> -->
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource1" />

    <!-- mysql 动态数据源设置-->
    <bean id="mysqlDynamicDataSource" class="com.chy.dangaowm.util.fund.DynamicDataSource">
        <property name="targetDataSources">
            <!-- 标识符类型 -->
            <map key-type="com.chy.dangaowm.util.fund.DBType">
                <entry key="dataSource1" value-ref="dataSource1"/>
                <entry key="dataSource2" value-ref="dataSource2"/>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dataSource1"/>
    </bean>

    <!-- 配置sessionFactory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="mysqlDynamicDataSource" />
        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            </props>
        </property>
        <property name="packagesToScan">
            <array>
                <value>com.chy.dangaowm.domain</value>
            </array>
        </property>
    </bean>

    <!-- 配置事务管理 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

解决方案

Java之——SpringMVC+MyBitis+多数据源切换

解决方案二:

没有人吗?这个问题不是问题吗?

解决方案三:

我要顶上去,我要顶上去,我要顶上去,够数了

时间: 2024-08-01 13:15:32

懒加载session-多数据源springmvc+hibernate 切换问题 在一次请求中多次切换不成功的相关文章

hibernate之xml映射文件关系维护,懒加载,级联

      一:关系维护   --->inverse默认值false,表示不放弃关系的维护.   --->inverse="true"配置在那一端,表示那一端xml对应的po放弃关系的维护(交由hibernate内部进行维护),由另一端进行关系维护.  例子:学生班级模型[多对一模型]一端放弃关系的维护,由学生端进行关系维护              ----->班级的xml映射文件中<set name="students" class=&q

jQuery.imgLazyLoad图片懒加载组件

一.前言 当一个页面中请求的图片过多,而且图片太大,页面访问的速度是非常慢的,对用户的 体验非常不友好:使用图片懒加载,可以减轻服务器的压力,增加页面的访问量,这里主要是总结一下我自己写的图片懒加载组件 jQuery.imgLazyLoad:使用该组件应在img标签中设置一个imglazyload-src属性,存放图片地址. 二.应用实例demo /**  * component: imgLazyLoad 2013/12/12 华子yjh  * invoking: jQuery.imgLazyL

Javascript实现图片懒加载插件的方法_javascript技巧

前言 网络上各大论坛,尤其是一些图片类型的网站上,在图片加载时均采用了一种名为懒加载的方式,具体表现为,当页面被请求时,只加载可视区域的图片,其它部分的图片则不加载,只有这些图片出现在可视区域时才会动态加载这些图片,从而节约了网络带宽和提高了初次加载的速度,具体实现的技术并不复杂,下面分别对其说明. Web 图片的懒加载就是通过读取img元素,然后获得img元素的data-src(也可以约定为其他属性名)属性的值,并赋予img的src,从而实现动态加载图片的机制. 这里需要注意的是: img在初

springmvc的jackson 和hibernate懒加载问题

问题描述 在springmvc转对象为json时,如果对象有懒加载,会报错.我所知解决办法有两种,但是都不能解决我的问题1.在实体类声明处加上@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler"})注解(无任何效果)2.使用jackson-module-hibernate,通过objectmapper注册个module解决,但是set集合会报错,单个懒加载对象没问题

hibernate3-spring mvc OpenSessionInViewFilter hibernate 懒加载问题

问题描述 spring mvc OpenSessionInViewFilter hibernate 懒加载问题 之前做了一个项目是使用 springmvc 加hibernate 做的, 并且使用了 hibernate 的懒加载有用到OpenSessionInViewFilter, 现在做另一个项目, 基础代码都是上个项目的代码: 目前调试在调试权限模块, 核对了上个项目的代码基本完全一致,但是这个项目的老是无法使用懒加载,加载报 org.hibernate.LazyInitializationE

Hibernate懒加载解析

Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了. 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库.    实现懒加载的前提:  1 实体类不能是final的 2 能实现懒加载的对象都是被CGLIB(反射调用)改

hibernate懒加载能用get方法吗

问题描述 hibernate懒加载能用get方法吗 hibernate中的session.load()方法特性是使用懒加载,那么请问hibernate中的session.get()方法在什么情况下也是使用的懒加载?还是说get方法没有懒加载,都是立即加载?看教程的时候发现测试集合的懒加载是用get方法取一对多的一对象而不是load方法 解决方案 http://blog.csdn.net/yaorongwang0521/article/details/7074573 解决方案二: get和load

问一个hibernate的懒加载的问题

问题描述 问一个hibernate的懒加载的问题 1.我定义Survey和Page类,Survey设置Page的集合属性,然后建立双向关联,我故意把集合注解成懒加载... 2.然后我通过这段代码把Page集合重数据库取出 3.然后调用Survey的get方法得到集合,再把Page一个一个放进集合中去 4.然后再外面迭代Survey的page集合抛异常是懒加载为什么?为什么?为什么? /* *通过survey的id取出survey *(我用spring在这方法上面配置了事务) */ public

spring mvc-Spring mvc结合Hibernate中实现ajxa出现懒加载异常

问题描述 Spring mvc结合Hibernate中实现ajxa出现懒加载异常 我要实现一个选择省份加载城市列表,然后选择城市加载区列表的操作,但是我在加载城市的时候一直报懒加载异常,session提前关闭,我觉得是因为我城市中设置的private Province province 对象的原因,请问大神这有什么好的解决办法吗 解决方案 懒加载的话,你直接用fetch属性设为eager就行了,session提前关闭,,可能是你的openSessionInView,,这个过滤器没用,,而且省市区