多数据源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" />
0

1个回答

是否配置了事务? 如果配置了事务,先把事务关闭,再试试。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Spring+Hibernate动态切换数据源以及失败解决方案
前言​ 本来只是动态数据源切换的话,是不准备记录下来当博客发表的。但是在使用Spring + Hibernate实现数据源切换时,遇到了切换失败的问题。无论是查看源码还是debug调试都解决不了,最后还是在网上找到了答案,这里留一个悬念。​ 所以本文主旨在查阅大量资料后解决动态切换数据源失败的问题,顺便在前面介绍如何进行配置动态切换数据源。所有场景以Spring 4.2.6 + Hibern
spring+hibernate多数据源切换
由于公司需求,需要在项目中动态切换数据源。nn废话少说,贴配置以及代码nnspring配置文件:nnnnn&lt;!-- 读取数据库配置信息 --&gt;n &lt;beann class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;n &lt;property name="locat...
springMVC+hibernate动态切换SessionFactory (切换数据库方言)
n最近用到多数据源动态切换,一直无法解决言的切换,参考此文后解决。rnSpring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)n
springMvc结合hibernate多数据源和多事务管理器
要到达的效果是: 1、可以使用注解在服务层选择数据源@DataSource 2、使用事务注解@Transactional选择不同的事务管理器 https://blog.csdn.net/u014572215/article/details/80064611
SpringMVC动态切换多个数据源解决方案(自测可用)
SpringMVC动态切换多个数据源解决方案nnnn1.数据源配置nnnn &amp;lt;!-- 事务 --&amp;gt;n &amp;lt;bean id=&quot;transactionManager&quot;n class=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;&amp;gt;n &amp;lt;propert...
springMVC中多数据源切换的两种主流实现方法(一)
说到多数据源,使用的场景一般有:1,主从数据库切换;2,多租户间数据逻辑隔离;nn本文后继的例子均以SSM架构为基础讲解,如你的框架不适合,请参考思路即可。nn最关键的是org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource类。nnnn-----------------------------------...
Spring+Hibernate多数据源整合
在一个项目中,可能用到不止一个数据库,这个时候就需要用Hibernate配置多数据源rn接上一篇文章:此处在上一篇文章中做一些修改rn第一步:修改applicationContext.xml文件、配置多个dataSource.并且配置每个dataSource相对应的sessionFactory,还要配置sessionFactory对应的transactionManagerrnrn修改之后的appl
spring配置多数据源涉及事务无法切换解决方案(绝对有效)
最近在做的项目需要操作两个数据源,并且是一个service需要同时调用两个数据源,刚开始按照网上说的配置通过切面操作AbstractRoutingDataSource这个类,发现单独去调用每一个数据源可以灵活切换,后来涉及事务一个service调用两个数据源就发现动态数据源无法切换了,琢磨了很久,终于找到原因。nn问题根源:nnspring涉及事务的代码调用顺序:nnservice注解上@tran...
使用spring 实现真正多数据源的动态加载及动态切换
1 前言:rn 公司需要做一个分析统计系统,该系统需要连接N台服务器结点,进行数据的统计分析操作,rn项目是以spring为基础框架搭建的.收集现在网上的所有关于多数据源配置的方式,并没有自己十分满意的,例如我有N个数据源,按照现网可以搜索到的配置方式,都是在spring配置文件中配置N个datasource,并通过实现AbstractRoutingDataSource抽象类的子类进行多数据源的...
spring+mybatis 多数据源切换失败的可能原因。
spring+mybatisn 多数据源切换失败的可能原因。n可能因为,加了事务。nnn// @Transactional(readOnly = false) // 需要事务操作必须加入此注解nnnn就因为加了事务,导致了,问题的出现。nnn害得我把spring的框架都改写了,不过由于过于暴力,所以没写。n重新折回去看看了代码。
基于spring的aop实现多数据源动态切换
rnrn 一、动态切换数据源理论知识rn 项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此;又例如:读写分离数据库配置的系统。rn1、相信很多人都知道JDK代理,分静态代理和动态代理两种,同样的,多数据源设置也分为类似的两种:rn1)静态数据源切换:rn一般情况下,我们可以配置多个数据源,然后为每个数据源写一套对应的sessionFactory和dao层,我们称之为静态数...
Spring基于aop多数据源切换
笔者之前论述过《spring 数据源-AbstractRoutingDataSource 》基于这个,我们只要保证,每次切换数据源,改变lookupkey就好了,具体思路就是创建一个AbstractRoutingDataSource 的子类,实现抽象方法determineCurrentLookupKey,每次修改数据源,就是让determineCurrentLookupKey返回不同的lookup...
spring mvc 多数据源配置 利用AOP手动切换
我的博客原文地址 http://www.yujunyi.com/java/spring-mvc/359.html n 欢迎访问nnn背景nnspring mvc 多数据源还有一种实现方式,利用 AOP 进行手动切换。nn基本原理是,我们自己定义一个 DataSource 类 DynamicDataSource ,来继承 AbstractRoutingDataSource ,然后在配置文件中...
Spring动态切换多数据源解决方案
rnSpring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。rn       Spring2.x以后的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用...
Spring实现多数据源配置以及切换,并解决加入事务控制出现切换失败的问题
1.多数据源的配置:nn    应用场景:(1)数据作读写分离,配置读库和写库。(2) 同步其他数据源数据库数据到项目默认的数据库对应表中,例如通过定时任务同步更新和修改操作nn这里主要介绍的是通过Spring AOP,加上注解的方式,在进行Service方法的访问前,先通过前置通知Before,执行数据源切换操作,然后再执行dao层代码,进行数据库的相关操作。nn 一.xml相关配置操作:nnn...
springboot+mybatis解决多数据源切换事务控制不生效的问题
网上好多的springboot的事务都是瞎扯,根本不起作用,后来通过各种渠道查证,springboot的生命式事务需要重写Transaction。追溯源代码:        查看源代码中DataSourceTransactionManager这个类       当我们配置了事物管理器和拦截Service中的方法后,每次执行Service中方法前会开启一个事务,并且同时会缓存一些东西:DataSou...
Spring动态切换数据源
nSpring动态切换数据源利用Spring相关功能实现动态切换数据源。主要使用Spring提供的AbstractRouteDataSource,当进行读数据操作时,查询指定读数据库,当进行写数据操作时,往指定数据库中写数据。1、相关配置文件去下:Spring-beans.xml:rn 2、动态数据源类DynamicDataSource:rn rn3、使用ThreadLocal设置/获取数据源...
springboot实现多数据源而且加上事务不会使aop切换数据源失效
用springboot 集成mybatis多数据源,用aop实现的动态切换,支持事务,不会使aop动态切换失效。注意:此代码不涉及分布式事务,如果需要分布式事务 需要采取其他方案。
Hibernate根据方言dialect动态连接多数据库
 rnHibernate根据方言dialect动态连接多数据库 由于最近需要在web项目中动态链接不同地址的数据库,且要链接的子数据库的信息在总数据库(即web项目的主数据库)的表中,所以动手写了一个类。 web项目试用了hibernate,动态生成的子数据库链接打算也用hibernate,虽然动态生成的sessionfactory类,以及Configuration配置没有子数据库的对象关系映射,...
Spring Boot 多数据源动态切换开启事务后,数据源切换失败
在项目中遇到需要使用多数据源的情况,解决办法是,使用注解,切面拦截来注入不同的dataSource。实现代码在底部。基本思路:在dao的方法前加上@TargetDataSource(ORDER_DATA_SOURCE)注解来表明使用的哪个数据源。问题:事务开启一般是在service中开启,事务开启后会导致数据源切换失败,数据源切换需要在事务开启前执行。解决:数据源切入点@Pointcut增加ser...
SpringMVC多数据源的单元测试
问题由于项目中配置的多数据源是动态,在service层的类上或方法上设置了注解,如@DataSource正常项目运行时可以使用的。但是单元测试时虽然进入了切面,默认运行的还是配置中设置的默认数据源,并没有切换数据源bean.xml&amp;lt;!--统一的dataSource--&amp;gt;n&amp;lt;bean id=&quot;dynamicDataSource&quot; class=&quot;com.lemo.rms.config...
spring+hibernate+mysql实现主从数据库动态切换
项目采用spring+springMVC+hibernate框架,mysql数据库,配置采用javaConfig,本文实现的是mysql的一主一从配置,仅仅限于学习,用于项目中还需要很多处理。
Spring通过URL来动态切换多数据源
1.多数据连接信息application.properties#dataBase1njdbc1.driver=org.mariadb.jdbc.Drivernjdbc1.url=jdbc:mariadb://localhost:3306/remotetestnjdbc1.username=rootnjdbc1.password=rootnjdbc1.pool.maxIdle=10njdbc1.po...
springmvc+mybatis多数据源配置,AOP注解动态切换数据源
springmvc与springboot没多大区别,springboot一个jar包配置几乎包含了所有springmvc,也不需要繁琐的xml配置,springmvc需要配置多种jar包,需要繁琐的xml配置,当然springmvc也可以使用java类来配置,但这种感觉没有xml配置来的直观。springboot+mybatis多数据源看这里下面是springmvc+mybatis动态多数据源完整...
动态多数据源引起C3p0线程过多问题
1.采用在applicationContext.xml配置主库数据源,应用启动时从主库表查询并创建其他数据源,并将数据源添加到Map&amp;lt;String,Datasource&amp;gt;,最后将map存入上下文application中。2.切换数据源采用AbstractRoutingDataSource类,在重写方法内查看类AbstractRoutingDataSource下map成员变量target...
Mybatis+Spring+SpringMVC+quartz多数据源切换
Mybatis+Spring+SpringMVC+quartz多数据源切换 定时任务 多数据库之间同步
关于spring-hibernate中,多数据源配置的一种实现方法(通过AbstractRoutingDataSource)
关于spring-hibernate中,多数据源配置的一种实现方法(通过AbstractRoutingDataSource)nn最近项目中需要用到动态切换数据源且希望做到最少的操作配置,于是研究了一番(网上copy),自己总结了一些容易出问题的地方:nnnAbstractRoutingDataSource 实现切换数据源的原理n数据源配置n代码示例nnnnnAbstractRoutingDataS...
AbstractRoutingDataSource数据源切换失败原因及解决方案
之前在项目中由于数据源比较多,为了方便切换数据源使用了AbstractRoutingDataSource+JdbcTemplate。刚开始都是查询操作,没有事物操作,但后来出现了一个事物操作,在一个service方法里面总是无法成功切换数据源。从网上搜了下也没有搜到解决方案,最后没办法只能阅读源码自己解决,最终定位到了问题,并成功的解决该问题。    问题原因:        在一个事物方法里面,...
Spring配置多个数据源,并实现数据源的动态切换
1.首先在config.properties文件中配置两个数据库连接的基本数据。这个省略了 n2.在spring配置文件中配置这两个数据源: n 数据源1 <!-- initialSize初始化时建立物理连接的个数0 maxActive最大连接池数量8 minIdle最小连接池数量0-->n <bean id="dataSource1" class="com.alibaba.druid
Hibernate动态数据源
使用目的出于在审计厅项目建设的需求,我们在项目建设工程先是使用了单一的数据库,经过三个月的代码编写,完成了单机的项目部署,在经过两台loadRunner进行2k的并发访问时,发现数据库的写日志缓冲区已经爆满,导致系统宕机。后来在老师的决策下将数据库分库存储,不同地区的数据利用切分工具进行数据的切分,然后使用ETL、dts配合自己写的脚本完成数据的迁移和各种角色、存储过程、权限的设置。
Atomikos分布式事务中切换数据源
分布式XA事务管理,多数据源动态切换, atomikos
springboot项目实现多数据源切换
在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据,下面是具体的实现方案1.   必要配置1.1       依赖包引入pom文件中引入相关支持&amp;lt;!-- 与数据库操作相关的依赖 --&amp;gt;n&amp;...
深入AbstractRoutingDataSource源码,分析多数据源切换原理
本文的源码分析是基于上一篇文章多数据源切换https://blog.csdn.net/u013034378/article/details/81455513,本文说的方法一,方法二,指的就是上一篇文章里的两种切换数据源的方法。nn1.AbstractRoutingDataSource实现InitializingBean接口,实现了afterPropertiesSet方法。afterProperti...
springboot springjpa 从数据库动态加载多数据源 并随意切换
背景:项目本来就是springboot+springJpa的框架,连接池用的德鲁伊DruidDataSource。nn想要在数据库配置多数据源,用户可以随便新增数据源,根据请求带的不同参数,controller层随意切换数据源,这样就可以同一套部署的代码,操作不同的数据库,有点 SaaS的味道,不过是各自独立的库。nn1.配置默认数据源nn2.启动之后加载数据库的数据源 并且加载到bean交给sp...
spring框架多数据源切换问题的解决
nrn Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性。而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时的请求及系统状态来动态的决定将数据存储在哪个数据库实例中,以及从哪个数据库提取数据。rnrnSpring配置多数据源的方式和具体使用过程。 Spring对于多数据源,以数据库表为参照,大体上可...
springmvc mybatis 多数据源 事务不生效
不生效有几种情况,父容器加载了有事务性的service,但在springmvc的配置文件中再次扫描导致失去事务性,这种rn网上比较多,大家搜一下就行。rnrn我主要介绍一种比较不容易让人注意的方式就是都数据源情况下加载的必须是统一数据源才行rn如下配置俩个数据源masterDataSource,slaveDataSourcebean id="masterDataSource" class="com
tab切换不再重复加载
自己写了一个tab控件,可是tab切换时不断的构造新的页面,也没有加任何的flag。rn代码如下:rnWindow subActivity = getLocalActivityManager().startActivity(rn &quot;subActivityid&quot;,intents.get(current-1));rnrnrn关键在于 subActivityid,每一个tab都应该是不同的,这样切...
SSM多数据源注解动态切换
最新搭建的博客:http://www.cnstudio.top/nn创建项目就跳过了,自行百度创建SSM项目及一般的配置。nn此文章前提是SSM基本配置已经完成,可以连接单数源。nn有两种方法,但大致一样,第一种是第一次找到的,但只能在controller层注解,从代码分工来讲,controller不应该处理数据方面的问题,所以第一种方法不推荐,第二种是在service层注解,推荐使用。nn方法1...
java单数据源改多数据源配置(hibernate)
xml配置nnnn&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;n&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; n xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; n xmlns:context=...
解决多个tab之间来回切换,iscroll.js 上拉加载更多出现重复请求加载问题
解决多个tab之间来回切换,iscroll.js 上拉加载更多出现重复请求加载问题。解决办法:设置一个标识,每个tab下面的iscroll对象只能初始化一次,这样就解决了。nn效果图这样的:nnnnnn关键代码,如下:nn$('.top &gt;span').on('click',function(){n if($(this).hasClass('all')){n page.pa...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习中常见的问题 java学习中遇到的问题