当前位置: 首页 > news >正文

购物商城网站搭建可以做配音兼职的网站

购物商城网站搭建,可以做配音兼职的网站,网上商城如何推广,揭阳做网站设计2019独角兽企业重金招聘Python工程师标准 最近在做保证金余额查询优化#xff0c;在项目启动时候需要把余额全量加载到本地缓存#xff0c;因为需要全量查询所有骑手的保证金余额#xff0c;为了不影响主数据库的性能#xff0c;考虑把这个查询走从库。所以涉… 2019独角兽企业重金招聘Python工程师标准 最近在做保证金余额查询优化在项目启动时候需要把余额全量加载到本地缓存因为需要全量查询所有骑手的保证金余额为了不影响主数据库的性能考虑把这个查询走从库。所以涉及到需要在一个项目中配置多数据源并且能够动态切换。 设计总体思路 Spring-BootAOP方式实现多数据源切换继承AbstractRoutingDataSource实现数据源动态的获取在service层使用注解指定数据源。 步骤 一、多数据源配置 在application.properties中我们的配置是这样的 #主数据源druid.master.urljdbc:mysql://url/masterdb?useUnicodetrueamp;characterEncodingutf8amp;zeroDateTimeBehaviorconvertToNulldruid.master.usernamexxxdruid.master.password123druid.master.driver-class-namecom.mysql.jdbc.Driverdruid.master.max-wait5000druid.master.max-active100druid.master.test-on-borrowtruedruid.master.validation-querySELECT 1#从数据源druid.slave.urljdbc:mysql://url/slavedb?useUnicodetrueamp;characterEncodingutf8amp;zeroDateTimeBehaviorconvertToNulldruid.slave.usernamexxxdruid.slave.password123druid.slave.driver-class-namecom.mysql.jdbc.Driverdruid.slave.max-wait5000druid.slave.max-active100druid.slave.test-on-borrowtruedruid.slave.validation-querySELECT 1读取配置 !-- master数据源 --bean primarytrue idmasterdb classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose!-- 基本属性 url、user、password --property namedriverClassName valuecom.mysql.jdbc.Driver/property nameurl value${druid.master.url}/property nameusername value${druid.master.username}/property namepassword value${druid.master.password}/!-- 配置初始化最大 --property namemaxActive value${druid.master.max-active}/!-- 配置获取连接等待超时的时间 --property namemaxWait value${druid.master.max-wait}/property namevalidationQuery value${druid.master.validation-query}/property nametestOnBorrow value${druid.master.test-on-borrow}//bean!-- slave数据源 --bean primarytrue idslavedb classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose!-- 基本属性 url、user、password --property namedriverClassName valuecom.mysql.jdbc.Driver/property nameurl value${druid.slave.url}/property nameusername value${druid.slave.username}/property namepassword value${druid.slave.password}/!-- 配置初始化大小、最小、最大 --property namemaxActive value${druid.slave.max-active}/!-- 配置获取连接等待超时的时间 --property namemaxWait value${druid.slave.max-wait}/property namevalidationQuery value${druid.slave.validation-query}/property nametestOnBorrow value${druid.slave.test-on-borrow}//bean!-- 动态数据源根据service接口上的注解来决定取哪个数据源 --bean iddataSource classdatasource.DynamicDataSourceproperty nametargetDataSourcesmap key-typejava.lang.Stringentry keyslave value-refslavedb/entry keymaster value-refmasterdb//map/propertyproperty namedefaultTargetDataSource refmasterdb//bean!-- Spring JdbcTemplate --bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplateproperty namedataSource refdataSource //bean!-- Spring事务管理器 --bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource //beanbean idtransactionTemplate classorg.springframework.transaction.support.TransactionTemplateproperty nametransactionManager reftransactionManager//beantx:annotation-driven transaction-managertransactionManager proxy-target-classtrue order2 /!-- depositdbSqlSessionFactory --bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBeanproperty namedataSource refdataSource /property namemapperLocations valueclasspath*:mapper-xxdb/*Mapper*.xml //beanbean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuexxdb.mapper/property namesqlSessionFactoryBeanName valuesqlSessionFactory//bean二. 数据源动态切换类 动态数据源切换是基于AOP的所以我们需要声明一个AOP切面并在切面前做数据源切换切面完成后移除数据源名称。 Order(1) //设置AOP执行顺序(需要在事务之前否则事务只发生在默认库中)AspectComponentpublic class DataSourceAspect {private Logger logger LoggerFactory.getLogger(this.getClass());//切点Pointcut(execution(* com.xxx.service.*.*(..)))public void aspect() { }Before(aspect())private void before(JoinPoint point) {Object target point.getTarget();String method point.getSignature().getName();Class? classz target.getClass();// 获取目标类Class?[] parameterTypes ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();try {Method m classz.getMethod(method, parameterTypes);if (m ! null m.isAnnotationPresent(MyDataSource.class)) {MyDataSource data m.getAnnotation(MyDataSource.class);logger.info(method :{},datasource:{},m.getName() ,data.value().getName());JdbcContextHolder.putDataSource(data.value().getName());// 数据源放到当前线程中}} catch (Exception e) {logger.error(get datasource error ,e);//默认选择masterJdbcContextHolder.putDataSource(DataSourceType.Master.getName());// 数据源放到当前线程中}}AfterReturning(aspect())public void after(JoinPoint point) {JdbcContextHolder.clearDataSource();}}三、数据源管理类 public class JdbcContextHolder {private final static ThreadLocalString local new ThreadLocal();public static void putDataSource(String name) {local.set(name);}public static String getDataSource() {return local.get();}public static void clearDataSource() {local.remove();}}四、动态数据源 spring为我们提供了AbstractRoutingDataSource即带路由的数据源。继承后我们需要实现它的determineCurrentLookupKey()该方法用于自定义实际数据源名称的路由选择方法由于我们将信息保存到了ThreadLocal中所以只需要从中拿出来即可。 public class DynamicDataSource extends AbstractRoutingDataSource {private Logger logger LoggerFactory.getLogger(this.getClass());Overrideprotected Object determineCurrentLookupKey() {String dataSource JdbcContextHolder.getDataSource();logger.info(数据源为{},dataSource);return dataSource;}}五、数据源注解和枚举 我们切换数据源时一般都是在调用具体接口的方法前实现所以我们定义一个方法注解当AOP检测到方法上有该注解时根据注解中value对应的名称进行切换。 Retention(RetentionPolicy.RUNTIME)Target(ElementType.METHOD)public interface MyDataSource {DataSourceType value();}public enum DataSourceType {// 主表Master(master),// 从表Slave(slave);private String name;private DataSourceType(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;}}六、切点注解 由于我们的动态数据源配置了默认库所以如果方法是操作默认库的可以不需要注解如果要操作非默认数据源我们需要在方法上添加MyDataSource(数据源名称)注解这样就可以利用AOP实现动态切换了 Componentpublic class xxxServiceImpl {Resourceprivate XxxMapperExt xxxMapperExt;MyDataSource(value DataSourceType.Slave)public ListObject getAll(){return xxxMapperExt.getAll();}}转载于:https://my.oschina.net/stephenzhang/blog/1786156
http://wiki.neutronadmin.com/news/253939/

相关文章:

  • 如何做网站泛目录解析page编辑wordpress
  • 长春站建了多少年网站开发技术三大件
  • 做网站的时候遇到的问题网站模板更换
  • 六枝做网站腾讯朋友圈广告怎么投放
  • 网站网页设计收费免费软件库合集软件资料网站
  • 技术支持:佛山网站建设wordpress滑动图片
  • wordpress大型网站温州城市建设投资集团网站
  • 怎么去建设微信网站泰兴市住房和建设局网站
  • 网站后台编辑器无法显示网站建设需求确定
  • 网站建设与管理内容找外包公司做个网站多少钱
  • 网站建设项目创业计划书网站建设网络营销平台 云搜系统
  • 广东省中山市网站新闻头条新闻
  • 做搜狗pc网站优化排消息网站怎么做
  • 沙漠风网站建设个人网站名称备案
  • 怎么查看网站是什么软件做的网站浏览历史能恢复吗怎么设置
  • 微信公众号 网站开发四川成都建设网
  • 帮人做网站赚钱吗ftp上传网站全教程
  • 鹿班设计网站官网成都必去十大网红景点
  • 网站运营是做什么的网站建设手机站
  • 网站制作公司深圳网址导航网站怎样做
  • 搜索引擎网站推广如何优化长春网站制作都找源晟27
  • 大理网站制作在线搜索引擎
  • 济南的网站制作公司江苏哪家做网站排名比较好
  • 优秀的定制网站建设商机加盟好项目
  • dw网站建设教程云南汽车网络营销
  • 重庆网站seo推广公司全国哪几家做5G网站公司
  • 网站策划与运营考试题玉林英文网站建设
  • 注册网站会不会有问题自己怎么给网站做优化排名
  • 内网网站开发报价wordpress 插件翻译
  • 一个网站建设的目标中企动力科技集团有限公司