ssm 配置多数据源

SSM多数据源配置(MySQL+Oracle) 背景 最近在写一个小项目时,项目数据库是MySQL。但是项目中需要获取另外一个数据库的数据以便使用,并且另一个数据库是Oracle。所以就需要在项目中配置多数据源。下面就简单介绍下SSM框架是如何配置多数据源的。 原理 MyBatis在创建SqlSession时,动态的使用不同的DataSource,这样就可以动态的使用不同的数据源。如何动态的使用不同的dataSource。在Spri... 阅读详情

原文链接:http://blog.youkuaiyun.com/q908555281/article/details/50316137


总体大概流程:

1. 拷贝所需jar

2.写一个数据库切换的工具类:DataSourceContextHolder,用来切换数据库
3.写一个DynamicDataSource类来继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法,来达到动态切换数据库
4. 创建springmvc-servlet.xml文件,然后创建spring配置文件(beans.xml)
5. 在beans.xml文件中配置数据源。我这里配置的三个数据源
6. 在beans.xml文件中创建sqlSessionFactory实例
7. 在beans.xml文件中配置事物、事物的传播性
8. 在beans.xml文件中配置AOP
9. 创建一个User对象,配置User.xml文件。写一个UserMapper接口,用来操作User对象的接口
10. 将User类的路径以及User.xml文件的路径在mybatis-config.xml文件中配置
11. 写一个UserService接口(接口里面的方法和UserMapper接口里面的方法一致,返回值和参数可不同,方法名最好一致),并写UserServiceImpl来实现UserService接口
12.写Controller类,并在其中写相对应的方法,给外部调用


下面看一下我的工程的目录:
common包存放的是一些公用类
controller包下放的是提供给外部访问的接口的(.do)类
datasource包下是用来配置数据库
entity:实体类

mapper:.....存放XXMapper以及实体类的对应表的关系的xml文件





下面一步步的来讲解:

1、拷贝jar文件。需要的jar文件入下图所示,因为我的项目中用到了json解析,所以导入了json相关的包



2.写一个数据库切换的工具类:DataSourceContextHolder,用来切换数据库

[java]  view plain  copy
  1. public class DataSourceContextHolder {  
  2.      private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
  3.   
  4.      public static void setDbType(String dbType) {  
  5.             contextHolder.set(dbType);  
  6.      }  
  7.   
  8.      public static String getDbType() {  
  9.             return ((String) contextHolder.get());  
  10.      }  
  11.   
  12.      public static void clearDbType() {  
  13.             contextHolder.remove();  
  14.      }  
  15. }  

3.写一个DynamicDataSource类来继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法,来达到动态切换数据库

[java]  view plain  copy
  1. import java.sql.SQLFeatureNotSupportedException;  
  2. import java.util.logging.Logger;  
  3.   
  4. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  
  5.   
  6. public class DynamicDataSource extends AbstractRoutingDataSource {  
  7.   
  8.      @Override  
  9.      public Logger getParentLogger() throws SQLFeatureNotSupportedException {  
  10.             return null;  
  11.      }  
  12.   
  13.      @Override  
  14.      protected Object determineCurrentLookupKey() {  
  15.             return DataSourceContextHolder. getDbType();  
  16.      }  
  17.   
  18. }  

4. 创建springmvc-servlet.xml文件,然后创建spring配置文件(beans.xml),看一下我的springmvc-servlet.xml文件。
   这里配置了一个注解扫描器,一般填自己的主包名就可以了,他会自动扫描我的com.baimi.routerweb包下面所有的带注解的类或者方法,常变量等。
   还配置了一个视图解析器(如果需要用到jsp文件,就需要配置此解析器)
   最后引入我的spring的配置文件:beans.xml文件

[html]  view plain  copy
  1. <?xml version="1.0" encoding= "UTF-8"?>  
  2. <beans xmlns= "http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:context= "http://www.springframework.org/schema/context"  
  5.        xmlns:mvc= "http://www.springframework.org/schema/mvc"  
  6.        xsi:schemaLocation= "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  7.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  9.   
  10.       <!-- 注解扫描器 -->  
  11.       <context:component-scan base-package ="com.baimi.routerweb"/>  
  12.         
  13.       <!-- 配置试图解析器 -->  
  14.       <bean class= "org.springframework.web.servlet.view.InternalResourceViewResolver" >  
  15.              <property name ="prefix" value="/"></ property>  
  16.              <property name ="suffix" value=".jsp"></ property>  
  17.       </bean >  
  18.         
  19.       <import resource ="classpath:beans.xml"/>  
  20.   
  21. </beans>  


5. 在beans.xml文件中配置数据源。我这里配置的三个数据源,不过在配置数据源之前,先配置一下注解扫描器。然后我接着配置了三个数据源,然后配置动态数据源

[html]  view plain  copy
  1. <context:component-scan base-package ="com" />  
  2.   
  3.    <!-- 多数据源配置 -->  
  4.    <bean id ="ds_admin" class= "org.apache.commons.dbcp.BasicDataSource" >  
  5.           <property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >  
  6.           <property name ="url" value= "jdbc:mysql://192.168.19.72:3307/100msh_admin" ></property >  
  7.           <property name ="username" value="root"></ property>  
  8.           <property name ="password" value="root"></ property>  
  9.    </bean >  
  10.    <bean id ="ds_partner" class= "org.apache.commons.dbcp.BasicDataSource" >  
  11.           <property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >  
  12.           <property name ="url"  
  13.                 value= "jdbc:mysql://192.168.19.72:3308/100msh_partner" ></property >  
  14.           <property name ="username" value="root"></ property>  
  15.           <property name ="password" value="root"></ property>  
  16.    </bean >  
  17.    <bean id ="ds_mop" class="org.apache.commons.dbcp.BasicDataSource">  
  18.           <property name ="driverClassName" value= "com.mysql.jdbc.Driver"></property >  
  19.           <property name ="url" value= "jdbc:mysql://192.168.19.72:3309/100msh_mop" ></property >  
  20.           <property name ="username" value="root"></ property>  
  21.           <property name ="password" value="root"></ property>  
  22.    </bean >  
  23.   
  24.    <!-- 动态配置数据源 -->  
  25.    <bean id ="dataSource" class= "com.baimi.routerweb.datasource.DynamicDataSource" >  
  26.           <property name ="targetDataSources">  
  27.                 <map key-type ="java.lang.String">  
  28.                       <entry value-ref ="ds_admin" key= "ds_admin"></entry >  
  29.                       <entry value-ref ="ds_partner" key= "ds_partner"></entry >  
  30.                       <entry value-ref ="ds_mop" key="ds_mop"></ entry>  
  31.                 </map >  
  32.           </property >  
  33.           <property name ="defaultTargetDataSource" ref= "ds_mop"></property >      <!-- 默认使用ds1的数据源 -->  
  34.    </bean >  

6. 在beans.xml文件中创建sqlSessionFactory实例

[html]  view plain  copy
  1. <!-- 创建SqlSessionFactory -->  
  2. <bean id ="sqlSessionFactoryBean" class= "org.mybatis.spring.SqlSessionFactoryBean" >  
  3.        <!-- 指定数据源 -->  
  4.        <property name ="dataSource" ref="dataSource" />  
  5.        <!-- 指定mybatis 的配置文件 -->  
  6.        <property name ="configLocation" value= "classpath:mybatis-config.xml" />  
  7. </bean >  

7. 在beans.xml文件中配置事物、事物的传播性

[html]  view plain  copy
  1. <!-- 配置事务 -->  
  2.       <bean id ="transactionManager"  
  3.              class= "org.springframework.jdbc.datasource.DataSourceTransactionManager" >  
  4.              <property name ="dataSource" ref="dataSource"></ property>  
  5.       </bean >  
  6.   
  7.       <!-- 映射接口 -->  
  8.       <bean class ="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  9.              <property name ="basePackage" value= "com.baimi.routerweb.mapper"></property >  
  10.       </bean >  
  11.   
  12.       <!-- 配置事务的传播特性 -->  
  13.       <tx:advice id ="txAdvice" transaction-manager="transactionManager">  
  14.              <tx:attributes >  
  15.                    <tx:method name ="find*" read-only="true" />  
  16.                    <tx:method name ="get*" read-only="true" />  
  17.                    <tx:method name ="query*" read-only="true" />  
  18.                    <tx:method name ="add*" propagation="REQUIRED" />  
  19.                    <tx:method name ="update*" propagation="REQUIRED" />  
  20.                    <tx:method name ="del*" propagation="REQUIRED" />  
  21.              </tx:attributes >  
  22.       </tx:advice >  

8. 在beans.xml文件中配置AOP,注意这里,expression 后面一定要是自己程序所在包名,复制的时候一定要改掉

[html]  view plain  copy
  1. <!-- 配置AOP -->  
  2. <aop:config >  
  3.        <!-- 切点 -->  
  4.        <aop:pointcut expression ="execution(* com.baimi.routerweb.service..*.*(..))"  
  5.              id= "pointcut" />  
  6.        <aop:advisor advice-ref ="txAdvice" pointcut-ref="pointcut" />  
  7. </aop:config >  

9. 创建一个User对象,配置User.xml文件。写一个UserMapper接口,用来操作User对象的接口。
    User类属性有点长,请忽略这些属性

[java]  view plain  copy
  1.   public class User {  
  2.      private int userId;  
  3.      private int compId;  
  4.      private String euserName;  
  5.      private String euserPhone;  
  6.      private int euserStatus;  
  7.      private String eAddTime;  
  8.      private String eLeaveTime;  
  9.      private String eUserNameCn;  
  10.      private int cUserId;  
  11.      private String scDown;  
  12.      private String userDesc;  
  13.   
  14.      public int getUserId() {  
  15.             return userId;  
  16.      }  
  17.   
  18.      public void setUserId( int userId) {  
  19.             this. userId = userId;  
  20.      }  
  21.   
  22.      public int getCompId() {  
  23.             return compId;  
  24.      }  
  25.   
  26.      public void setCompId( int compId) {  
  27.             this. compId = compId;  
  28.      }  
  29.   
  30.      public String getEuserName() {  
  31.             return euserName;  
  32.      }  
  33.   
  34.      public void setEuserName(String euserName) {  
  35.             this. euserName = euserName;  
  36.      }  
  37.   
  38.      public String getEuserPhone() {  
  39.             return euserPhone;  
  40.      }  
  41.   
  42.      public void setEuserPhone(String euserPhone) {  
  43.             this. euserPhone = euserPhone;  
  44.      }  
  45.   
  46.      public int getEuserStatus() {  
  47.             return euserStatus;  
  48.      }  
  49.   
  50.      public void setEuserStatus( int euserStatus) {  
  51.             this. euserStatus = euserStatus;  
  52.      }  
  53.   
  54.      public String geteAddTime() {  
  55.             return eAddTime;  
  56.      }  
  57.   
  58.      public void seteAddTime(String eAddTime) {  
  59.             this. eAddTime = eAddTime;  
  60.      }  
  61.   
  62.      public String geteLeaveTime() {  
  63.             return eLeaveTime;  
  64.      }  
  65.   
  66.      public void seteLeaveTime(String eLeaveTime) {  
  67.             this. eLeaveTime = eLeaveTime;  
  68.      }  
  69.   
  70.      public String geteUserNameCn() {  
  71.             return eUserNameCn;  
  72.      }  
  73.   
  74.      public void seteUserNameCn(String eUserNameCn) {  
  75.             this. eUserNameCn = eUserNameCn;  
  76.      }  
  77.   
  78.      public int getcUserId() {  
  79.             return cUserId;  
  80.      }  
  81.   
  82.      public void setcUserId( int cUserId) {  
  83.             this. cUserId = cUserId;  
  84.      }  
  85.   
  86.      public String getScDown() {  
  87.             return scDown;  
  88.      }  
  89.   
  90.      public void setScDown(String scDown) {  
  91.             this. scDown = scDown;  
  92.      }  
  93.   
  94.      public String getUserDesc() {  
  95.             return userDesc;  
  96.      }  
  97.   
  98.      public void setUserDesc(String userDesc) {  
  99.             this. userDesc = userDesc;  
  100.      }  
  101. }    


编写UserMapper接口,这里面的方法是用来操作User对象的,我这里只是一个简单的根据手机号码,得到这个User对象
[java]  view plain  copy
  1. public interface UserMapper {  
  2.      public User getUser(String euserPhone);  
  3. }  

编写User.xml文件,该文件里面配置User类里面的属性和表中的那些字段进行对应,以及在UserMapper中定义的查询的方法,在User.xml中写上对应的查询语句,我这里是查的t_expand_user 表

[html]  view plain  copy
  1. <?xml version="1.0" encoding= "UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  5.   
  6. <mapper namespace= "com.baimi.routerweb.mapper.UserMapper" >  
  7.       <resultMap type ="User" id="usermap">  
  8.              <result property ="userId" column="euser_id" />  
  9.              <result property ="compId" column="comp_id" />  
  10.              <result property ="euserName" column="euser_name" />  
  11.              <result property ="euserPhone" column="euser_phone" />  
  12.              <result property ="euserStatus" column="euser_status" />  
  13.              <result property ="eAddTime" column="e_add_time" />  
  14.              <result property ="eLeaveTime" column="e_leave_time" />  
  15.              <result property ="eUserNameCn" column="euser_name_cn" />  
  16.              <result property ="cUserId" column="user_id" />  
  17.              <result property ="scDown" column="sc_own" />  
  18.              <result property ="userDesc" column="euser_desc" />  
  19.       </resultMap >  
  20.   
  21.       <!-- 查询一条记录 -->  
  22.       <select id ="getUser" parameterType="java.lang.String" resultMap= "usermap">  
  23.             select * from t_expand_user where euser_phone=#{euserPhone}  
  24.       </select >  
  25.   
  26. </mapper>  


10. 将User类的路径以及User.xml文件的路径在mybatis-config.xml文件中配置

[html]  view plain  copy
  1. <?xml version="1.0" encoding= "UTF-8" ?>  
  2. <!DOCTYPE configuration  
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd" >  
  5. <configuration>  
  6.   
  7.       <!-- 别名 -->  
  8.       <typeAliases >  
  9.              <typeAlias type ="com.baimi.routerweb.entity.User" alias= "User" />  
  10.       </typeAliases >  
  11.       <mappers >  
  12.              <mapper resource ="com/baimi/routerweb/mapper/User.xml" />  
  13.       </mappers >  
  14. </configuration>  

11. 写一个UserService接口(接口里面的方法和UserMapper接口里面的方法一致,返回值和参数可不同,方法名最好一致),并写UserServiceImpl来实现UserService接口

[java]  view plain  copy
  1. public interface UserService {  
  2.      public User getUser(String euserPhone);  
  3. }  

UserServiceImpl里面要做的就是调用UserMapper中的方法
[java]  view plain  copy
  1. import javax.annotation.Resource;  
  2.   
  3. import org.springframework.stereotype.Service;  
  4.   
  5. import com.baimi.routerweb.datasource.DataSourceContextHolder;  
  6. import com.baimi.routerweb.datasource.DataSourceType;  
  7. import com.baimi.routerweb.entity.User;  
  8. import com.baimi.routerweb.mapper.UserMapper;  
  9. import com.baimi.routerweb.service.UserService;  
  10.   
  11. @Service  
  12. public class UserServiceImpl implements UserService {  
  13.   
  14.      @Resource(name = "userMapper")  
  15.      private UserMapper userMapper;  
  16.   
  17.      @Override  
  18.      public User getUser(String euserPhone) {  
  19.           DataSourceContextHolder. setDbType(DataSourceType.SOURCE_MOP);  
  20.             return userMapper.getUser(euserPhone);  
  21.      }  
  22.   
  23. }  


12.写Controller类,并在其中写相对应的方法,给外部调用,这里主要就是两行代码:注意每次要和数据库打交道之前,切换到相对应的数据库,我的DataSourceType. SOURCE_MOP="ds_mop"; 这里的名字一定要和beans.xml里面配置的数据源的名称一样

[java]  view plain  copy
  1. //切换数据库  
  2. DataSourceContextHolder. setDbType(DataSourceType. SOURCE_MOP);  
  3. //从数据库中得到该用户的数据  
  4. User user= userService.getUser(userId);  

整个Controller类的代码
[java]  view plain  copy
  1.   
[java]  view plain  copy
  1. import javax.annotation.Resource;  
  2. import javax.servlet.http.HttpServletRequest;  
  3. import javax.servlet.http.HttpServletResponse;  
  4.   
  5. import net.sf.json.JSONObject;  
  6.   
  7. import org.springframework.stereotype.Controller;  
  8. import org.springframework.web.bind.annotation.RequestMapping;  
  9.   
  10. import com.baimi.routerweb.common.Constant;  
  11. import com.baimi.routerweb.common.ErrorHandle;  
  12. import com.baimi.routerweb.datasource.DataSourceContextHolder;  
  13. import com.baimi.routerweb.datasource.DataSourceType;  
  14. import com.baimi.routerweb.entity.User;  
  15. import com.baimi.routerweb.service.UserService;  
  16. import com.baimi.routerweb.util.HttpUtil;  
  17.   
  18. @Controller  
  19. public class MainController {  
  20.   
  21.      @Resource(name = "userServiceImpl")  
  22.      private UserService userService;  
  23.   
  24.      @RequestMapping("/login.do")  
  25.      public String login(HttpServletRequest request, HttpServletResponse response) {  
  26.             // 获取客户端传过来的code的值  
  27.            String code = request.getParameter( "code");  
  28.             if (code == null || "".equals(code)) {  
  29.                  return ErrorHandle.getError(ErrorHandle.INVALID_TOKEN, "invalid token");  
  30.            }  
  31.             // 从微信得到token的值  
  32.            JSONObject objToken = HttpUtil.httpRequest(Constant.URL_WEIXIN_TOKEN, "GET", null);  
  33.             if (objToken == null || "".equals(objToken)) {  
  34.                  return ErrorHandle.getError(ErrorHandle.SERVICE_UNRESPONSE, "service unresponse");  
  35.            }  
  36.             if (!objToken.has( "access_token")) {  
  37.                  return ErrorHandle.getError(ErrorHandle.INVALID_TOKEN, "invalid token");  
  38.            }  
  39.             //根据token和code得到UserId  
  40.            JSONObject objUser = HttpUtil.httpRequest(Constant.URL_GET_USERID,  
  41.                       "POST", "access_token=" + objToken.getString("access_token" )+ "&code=" + code + "&agentid=1");  
  42.             if(objUser== null|| "".equals(objUser)){  
  43.                  return ErrorHandle.getError(ErrorHandle.SERVICE_UNRESPONSE, "service unresponse");  
  44.            }  
  45.             if(!objUser.has( "UserId")){  
  46.                  return ErrorHandle.getError(ErrorHandle.INVALID_TOKEN, "invalid token");  
  47.            }  
  48.            String userId=objUser.getString( "UserId");  
  49.             //切换数据库  
  50.           DataSourceContextHolder. setDbType(DataSourceType.SOURCE_MOP);  
  51.             //从数据库中得到该用户的数据  
  52.            User user= userService.getUser(userId);  
  53.             if(user!= null){  
  54.                 JSONObject rtObj = new JSONObject();  
  55.                 rtObj.put( "userId", String.valueOf(user.getUserId()));  
  56.                  return rtObj.toString();     
  57.            }  
  58.             return ErrorHandle.getError(ErrorHandle.INVALID_USER,"invalid user");  
  59.      }  
  60. }  
基于SSM框架的多数据源配置实战 SSM(Spring + Spring MVC + MyBatis)是当前Java Web开发中最主流的轻量级框架组合。Spring作为核心容器,通过IoC(控制反转)管理对象生命周期与依赖关系,通过AOP(面向切面编程)实现日志、事务等横切关注点的解耦;Spring MVC则负责Web层的请求调度,具备灵活的控制器、视图解析和数据绑定机制;MyBatis作为持久层框架,采用ORM(对象关系映射)方式,将Java对象与数据库记录进行映射,简化数据库操作。 阅读详情

相关推荐

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6230

Spring+SpringMVC+Mybatis 多数据源整合

此篇文章是基于Spring3.0和mybatis3.2的 总体大概流程: 1. 拷贝所需jar 2.写一个数据库切换的工具类:DataSourceContextHolder,用来切换数据库 3.写一个DynamicDataSource类来继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法,来达到动态切换数据库 4.

Townkoim的专栏 4万+

ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼

本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。

weixin_28523493的博客 331

Java动态存储配置信息,Java Spring4配置动态数据源(AbstractRoutingDataSource )

Spring配置多数据源的方式和具体使用过程。Spring对于多数据源,以数据库表为参照,大体上可以分成两大类情况:一是,表级上的跨数据库。即,对于不同的数据库却有相同的表(表名和表结构完全相同)。二是,非表级上的跨数据库。即,多个数据源不存在相同的表。Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑...

weixin_42297446的博客 291

WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头

WD西部数据2TB,2.5寸移动硬盘,因为磁头坏了,长时间通电导致划片划伤,维修过程通过反复更换磁头,才能利用专业设备,里面找到,镜像,把内容数据恢复出来。 1.说一下经历,借用的别人移动硬盘,去帮别人维修,拷数据出来,别人的文件,数据比较多,且复杂,而且是在PE系统,接口什么的是2.0,没有很好的思考就全选复制拷贝了; 2,拷贝的过程,极其慢,文件多,且文件有损坏,移动硬盘一直处于通电的状态,大概从下午,两点多开始100多G的数据,一直卡住,到,晚上7 。8点拷完还是没拷完。打开的时候就已经,就一直

weixin_43766920的博客 4303

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细介绍了企业微信群机器人Webhook的配置流程,从创建机器人到获取Webhook地址,再到发送各类消息的完整步骤。通过Python代码示例展示了文本、Markdown等消息类型的发送方法,并提供了性能优化建议和常见问题排查技巧,帮助企业高效实现自动化消息推送。

weixin_29208327的博客 6853

spring 解决多数据源问题,主要的继承类为AbstractRoutingDataSource

这里外部需要创建三个java类:首先在,spring里这样写:<!-- 解决多数据源 --> <bean id="dynamicDataSource" class="com.sinosoft.risk.system.datasource.DynamicDataSource"> <!-- 通过key-value的形式来关联数据源 --> <property na

寂寞是一个人的狂欢,狂欢是一群人的寂寞... 849

在昇腾910B上,用kubeadm快速拉起一个双节点K8s集群(保姆级避坑指南)

本文详细介绍了在昇腾910B服务器上使用kubeadm快速搭建双节点Kubernetes集群的完整流程,包括环境准备、容器运行时配置、kubeadm初始化、节点加入与网络插件部署等关键步骤,特别针对ARM架构和昇腾芯片提供了优化配置和避坑指南。

weixin_29204749的博客 247

spring+SpringMVC+MyBatis之配置多数据源

数据库准备   1、准备2个数据库,本例以mysql为例在第一个数据库新建表user 在第二个数据库中,新建表dog 项目搭建   1、搭建一个Springmvc + Spring + Mybatis maven项目, POM文件中引入AOP相关依赖 项目目录: 配置文件jdbc.properties 编辑一个扩展AbstractRoutingDataSource类,DynamicDataSource.java 封装一个的对数据源进行操作的类,DataSourceHolder.java 我们可以应用sp

reg183的专栏 1473

计组实验之四路表决器

请在之前四路表决器电路实现的基础上,继续用连接线 联接CD4511,将投票为1的票数总和显示到一个 LED上,思考如何做?由于我们需要通过显示字形来直接看出有几个1,在这里,我们最多有四个1,即显示字形最多到4就行,所以我们需要将有几个1用2进制数来表示,下面给出了相关电路图。显示输入插口,按真值表(自拟)要求,逐次改变输入变量, 测量相应的输出值,验证逻辑功能, 与表3-1 进行比较, 验证所设计的逻辑电路是否符合要求。用实验结果与真值表3-1和3-2进行比对,可以得出,我们实验结果是正确的。

szyugly的博客 1万+

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 314

SpringBoot + MyBatis配置多数据源

引子 最近项目中,由于数据源更替,部分原来的需要通过REST API获取的数据需要切换成 直接从数据库中获取,所以,需要给项目配置多数据源。在查阅了一些文档后,这里记录下自己亲身实践后的结果,希望能帮到大家。 配置项 下面是在 application.properties 中配置的数据: # 多数据源配置,数据源一 user.datasource.jdbcUrl= user.dataso...

蛋壳城堡 442

化工设备设计软件:PVELITE二次开发_(12).数据导入导出与兼容性

在数据导入之前,需要定义数据在PVELITE中的结构。可以通过编程接口定义字段名称和数据类型。# 导入必要的库 import pvelite # 创建PVELITE实例 pve = pvelite . PVELITE() # 定义CSV数据结构 csv_structure = {

kkchenjj的博客 1216

ssm框架配置多数据源的方式

ssm框架配置多数据源的方式 项目开发过程中,我们可能涉及到链接多个数据库进行数据存取等操作。这个时候我们就需要配置多个数据源。其中配置多数据源有很多种方式。 话不多说,上教程。 1、首先搭建SSM框架,这就不必再多介绍。想必大家的项目里单数据源的情况下都已经能连上数据库了。 2、配置多数据源之前,我们肯定要知道我们这个数据源要连接的是什么库,比如Oracle,mysql,SQL Server等。配置前,我们需要把链接数据库的驱动jar包放到项目的lib下,因为有了驱动,我们才可以链接。(我以Orac

头发都掉光了的博客 577

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ssm框架+多数据源+事务配置

ssm框架配置事务 正常的配置文件spring-mybatis.xml <?xml version='1.0' encoding='UTF-8' ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta...

升级打怪 288

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SSM框架配置多数据源oracle+mysql

最近在项目中需要对接其他系统平台的数据库,自己的系统是SSM架构,用的是Orcal数据库,需要获取对接系统的mysql数据库的数据,因此需要在自己系统上配置一个mysql的数据源。结合自己系统的文件配置,查了一下网上的案列,把自己总结的配置多数据源的过程总结如下。 1,dataSource.properties添加orcal和mysql数据库 url = jdbc:oracle:thin:@10.100.***.**:1521:uat driverClassName = oracle....

qq_23927391的博客 896

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SSM 多数据源配置

ssm项目双数据源配置

qq_33609768的博客 494

java基于ssm框架整合的多数据源配置

java基于ssm框架整合的多数据源配置 项目基于maven管理,简单易懂。 源代码下载地址:http://download.youkuaiyun.com/detail/feiwusuoai/9566210 或者:https://github.com/wangguan5188/moreDataSource/tree/develop

feiwusuoai的博客 894

ssm框架 mysql 一对多_SSM框架之多数据源配置

多数据源的应用场景:主要是数据库拆分后,怎样让多个数据库结合起来来达到业务需求。SSM框架(Spring+SpringMVC+MyBatis(MyBatis-Plus))是目前最常用的,此次仍然是maven工程。关于这个多数据源例子,我已经上传到我的github上,地址为:https://github.com/youcong1996/study_simple_demo.git不过需要注意的是,分支...

weixin_39533742的博客 200

【原创】SSM框架(2):多数据源支持,动态配置依赖的数据源

一、SSM框架配置多数据源的原理   原理:MyBatis在创建SqlSession时,动态的使用不同的dataSource,就可以动态的使用不同的数据源。   那么,怎样才能动态的使用不同的dataSource呢? 在Spring框架中,提供了一个类AbstractRoutingDataSource,顾名思义叫做路由选择。该类AbstractRoutingDataSource继承Abstra...

weixin_33875564的博客 210

mysql之整合ssm多数据源配置

一,基于SSM框架的多数据源配置 1.创建DynamicDataSourceHolder用于持有当前线程中使用的数据源标识 public class DynamicDataSourceHolder { /** * 注意:数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰 */ private static final ThreadLoca...

weixin_34208185的博客 241

ssm框架多数据源配置详解

文章说明:本文为懒汉式教程,只需要粘贴复制就可以实现。 废话不多说,直接代码走起 这里已ssm框架为例,项目所需的相关依赖jar都已经集成在框架中了。。。 1、数据源连接参数 jdbc.properties jdbc.driverClassName=com.mysql.jdbc.Driver #mysql----1 jdbc.url=jdbc\:mysql\://47.96.67.113...

qq_34295227的博客 787

SSM框架多数据源配置以及一直调用默认的数据源的问题

SSM框架多数据源配置失效,一直调用默认数据库的原因

qq_36722167的博客 2758

SSM 多数据源配置(配置两个数据源)

SSM多数据源配置(配置两个数据源) 前言:SSM项目需要配置多数据源,以达到操作不同数据库的数据,网上看到大多是通过动态切换数据源的方式,但在项目中总会出现问题,这里通过配置两个spring-mybatis.xml(sqlSessionFactory,transactionManager),可以避免数据源切换问题。 具体思路如下: 1.ssm框架搭建略,系统项目结构如下: 注意点:两个数据源需要...

8770

SSM项目多数据源配置(MySQL+SQL Server)

SSM项目多数据源配置(MySQL+SQL Server) 核心代码百度云下载: https://pan.baidu.com/s/1eWVeVageYiRKyRbwiEAQVA 提取码:gioj 核心代码文件结构 一、MySQL 多数据源配置 1、pom.xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-bo

qq_40359932的博客 795

SSM框架基于注解的多数据源配置

原来写过一篇基于SSM框架配置多数据源,但是在控制器中使用时需要使用代码切换数据源并进行关闭,相对来说比较麻烦,近期在项目开发中,使用了一种新的多数据源配置方法,在service中通过注解的方式设置数据源。下面介绍具体的实现步骤。 (一)数据源切换及选择处理工具类引入 (1...

chezhi8076的博客 249
上一篇: idea 使用
下一篇: js 运算的字符串 判断运算是否合法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值