多数据源?
是指两个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>
- 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();
}
}