java-web开发解惑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lineuman/article/details/80782849

多数据源?
是指两个host?还是只一个host下面多个数据库?

还有一个web开发方面的重头戏,数据的操作。
什么是jpa? mybatis? hibernate? druid?
java Persistence Api ,一个持久化接口标准
hibernate是一个orm框架,可以理解未jpa的一种实现
mybatis
druid是一个数据库连接池,例如mybatis自身是带着数据库连接池的,你可以把mybatis自身的数据库连接池替换成druid

AOP

拦截器

RPC

mq

阿里云oss

redis缓存

Filter和Interceptor的区别?和AOP有什么不同呢?

https://www.jianshu.com/p/39c0cfe25997
https://blog.csdn.net/reggergdsg/article/details/52962774
作用时间和空间不同,xml的配置方法不同

filter 在web.xml
interceptor在 applicationContext.xml interceptor是spring mvc里面的
粗略的访问顺序
http-> filter -> servlet -> interceptor -> controller

比较一,filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。

项目代码中有如下实现
1. interceptor servlet-dispatcher.xml

public class LoginInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
public void postHandle
public void afterCompletion
}
mvc:interceptors>
        <bean class="com.hello.rest.interceptor.LoginInterceptor" />

</mvc:interceptors>
  1. web.xml filter
public class TestFilter implements Filter {
 public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {}
                         }                        

applicationContext.xml 和dispatcher-servlet.xml

difference-between-applicationcontext-xml-and-spring-servlet-xml-in-spring-framework

多数据源切换? 例如mysql有多个库,如何进行切换

使用AbstractRoutingDataSource+aop动态数据源切换
使用druid作为数据源管理
数据库路由

大体流程是:aop拦截mapper, 如果有设置数据库注解,则设置这个线程的数据源,当dataSource装配的时候,就会选择合适的数据源

<bean id="fqgjDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc_connection_url}"/>
        <property name="username" value="${jdbc_connection_username}"/>
        <property name="password" value="${jdbc_connection_password}"/>
        <property name="maxActive" value="${jdbc_pool_c3p0_max_size}"/>
        <property name="initialSize" value="${jdbc_pool_c3p0_initial_pool_size}"/>
        <property name="maxWait" value="60000"/>
        <property name="minIdle" value="1"/>
        <property name="timeBetweenEvictionRunsMillis" value="6000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <property name="validationQuery" value="SELECT 'x' FROM DUAL"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <!-- 开启Druid的监控统计功能 -->
        <property name="filters" value="stat"/>
    </bean>

<bean id="openDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc_open_connection_url}"/>
        <property name="username" value="${jdbc_open_connection_username}"/>
        <property name="password" value="${jdbc_open_connection_password}"/>
        <property name="maxActive" value="${jdbc_pool_c3p0_max_size}"/>
        <property name="initialSize" value="${jdbc_pool_c3p0_initial_pool_size}"/>
        <property name="maxWait" value="60000"/>
        <property name="minIdle" value="1"/>
        <property name="timeBetweenEvictionRunsMillis" value="6000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <property name="validationQuery" value="SELECT 'x' FROM DUAL"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <!-- 开启Druid的监控统计功能 -->
        <property name="filters" value="stat"/>
    </bean>

<bean id="dataSource" class="com.fqgj.jkzj.common.mutidatasource.PartitionDataSource">

        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="fqgj" value-ref="fqgjDataSource"/>
                <entry key="open" value-ref="openDataSource"/>
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="openDataSource"/>
    </bean>

 <!-- 创建SqlSessionFactory,同时指定数据源-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:sqlmap-config.xml"/>
        <property name="mapperLocations">
            <list>
                <value>classpath*:mapper/*.xml</value>
                <value>classpath*:mapper/base/*.xml</value>
                <value>classpath*:mapper/*/*.xml</value>
            </list>
        </property>
    </bean>

<bean id="sqlSessionReuse" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
        <constructor-arg index="1" value="REUSE"/>

public class PartitionDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return PartitionContext.getPartitionKey();
    }

}

猜你喜欢

转载自blog.csdn.net/lineuman/article/details/80782849