1.配置文件application.yml,或者application-dev.yml/application-test.yml等
spring:datasource:story:jdbc-url: jdbc:mysql:replication://URL1:3306,URL2:3306/story?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&autoReconnect=trueusername: adminpassword: 123456driver-class-name: com.mysql.jdbc.Driverstudent:jdbc-url: jdbc:mysql:replication://URL1:3306,URL2:3306/student?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&autoReconnect=trueusername: adminpassword: 123456driver-class-name: com.mysql.jdbc.Driverjpa:database: mysqldatabase-platform: org.hibernate.dialect.MySQL5Dialectshow-sql: truehibernate:ddl-auto: updatedata:mongodb:uri: mongodb://url1:3717,url2:3717/admin?replicaSet=mgset-4834931
redis:story:host: url1password: password1port: 6379pool:max-idle: 8min-idle: 0max-active: 8max-wait: -1db:index: 0storyCommentReply: test_story_comment_reply_cmsstudent:host: url2password: password2port: 6379pool:max-idle: 8min-idle: 0max-active: 8max-wait: -1db:index: 0storyCommentReply: test_story_comment_reply_cms
2.数据源配置类 DataSourceConfig (根据配置文件数据库配置前缀,配置数据源)
@Configuration
public class DataSourceConfig {@Bean(name = "storyDataSource")@Qualifier("storyDataSource")@ConfigurationProperties(prefix = "spring.datasource.story")public DataSource storyDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "studentDataSource")@Qualifier("studentDataSource")@Primary@ConfigurationProperties(prefix = "spring.datasource.student")public DataSource activityDataSource() {return DataSourceBuilder.create().build();}}
3.数据库数据源配置 StoryConf、StudentConf
根据实际业务将不同的mapper/dao/repository包与不同的数据库数据源关联
1)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryStory",transactionManagerRef = "transactionManagerStory",basePackages = {"com.cms.story.repository"})public class StoryConf {@Autowired@Qualifier("storyDataSource")private DataSource storyDataSource;@Bean(name = "entityManagerStory")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryStory(builder).getObject().createEntityManager();}@Bean(name = "entityManagerFactoryStory")public LocalContainerEntityManagerFactoryBean entityManagerFactoryStory(EntityManagerFactoryBuilder builder) {return builder.dataSource(storyDataSource).properties(getVendorProperties()).packages("com.cms.story.domain").persistenceUnit("StoryPersistenceUnit").build();}@Autowiredprivate JpaProperties jpaProperties;private Map<String, Object> getVendorProperties() {HibernateSettings hibernateSettings = new HibernateSettings();return jpaProperties.getHibernateProperties(hibernateSettings);}@Bean(name = "transactionManagerStory")public PlatformTransactionManager transactionManagerStory(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryStory(builder).getObject());}
}
2)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryStudent",transactionManagerRef = "transactionManagerStudent",basePackages = {"com.cms.student.repository"})
public class StudentConf {@Autowired@Qualifier("studentDataSource")private DataSource studentDataSource;@Primary@Bean(name = "entityManagerStudent")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryStudent(builder).getObject().createEntityManager();}@Primary@Bean(name = "entityManagerFactoryStudent")public LocalContainerEntityManagerFactoryBean entityManagerFactoryStudent(EntityManagerFactoryBuilder builder) {return builder.dataSource(studnetDataSource).properties(getVendorProperties()).packages("com.cms.student.domain").persistenceUnit("studentPersistenceUnit").build();}@Autowiredprivate JpaProperties jpaProperties;private Map<String, Object> getVendorProperties() {HibernateSettings hibernateSettings = new HibernateSettings();return jpaProperties.getHibernateProperties(hibernateSettings);}@Primary@Bean(name = "transactionManagerstudent")PlatformTransactionManager transactionManagerStudent(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryStudent(builder).getObject());}
}
3)mongodb 自定义注解实现mongo自增id
1>自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface GeneratedValue {String name() default "";
}
2>
@Document(collection = "sequence")
public class SequenceId {@Idprivate String id;@Field("seq_id")private long seqId;@Field("coll_name")private String collName;public String getId() {return id;}public void setId(String id) {this.id = id;}public long getSeqId() {return seqId;}public void setSeqId(long seqId) {this.seqId = seqId;}
}
3>
@Component
public class SaveMongoEventListener extends AbstractMongoEventListener<Object> {static Logger LOGGER = LoggerFactory.getLogger(SaveMongoEventListener.class);@Resourceprivate MongoTemplate mongoTemplate;@Overridepublic void onBeforeConvert(BeforeConvertEvent<Object> event) {Object source = event.getSource();if (source != null) {ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() {@Overridepublic void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {ReflectionUtils.makeAccessible(field);String name = source.getClass().getSimpleName();if (field.isAnnotationPresent(GeneratedValue.class)) {try {GeneratedValue generatedValue = field.getAnnotation(GeneratedValue.class);if (StringUtils.isNoneBlank(generatedValue.name())) {name = generatedValue.name();}} catch (Exception e) {LOGGER.error("", e);}if (field.getLong(source) == 0) {field.set(source, getNextId(name));}}}});}}@Overridepublic void onBeforeSave(BeforeSaveEvent<Object> event) {super.onBeforeSave(event);}/*** 获取下一个自增ID* @param collName 集合名* @return*/public Long getNextId(String collName) {Query query = new Query(Criteria.where("collName").is(collName));Update update = new Update();update.inc("seqId", 1);FindAndModifyOptions options = new FindAndModifyOptions();options.upsert(true);options.returnNew(true);SequenceId seqId = mongoTemplate.findAndModify(query, update, options, SequenceId.class);return seqId.getSeqId();}}
4.实体类 mysql,mongodb
1)
@Data
@Entity
@Table(name = "cms_tory")
public class Story implements Serializable{
private static final long serialVersionUID = -372032482956107074L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//其他字段
}
2)
@Data
@Document(collection = "cms_student")
public class Student implements Serializable {private static final long serialVersionUID = 2025623618542249328L;/*** 主键Id*/@Id@GeneratedValue(name = "StudentEntity")private long id;
//其他字段
}
5.redis配置
@Configuration
public class RedisConf {
@Bean(name = "redisStoryTemplate")
public StringRedisTemplate redisStoryTemplate(
@Value("${redis.story.host}") String hostName,
@Value("${redis.story.port}") int port,
@Value("${redis.story.password}") String password,
@Value("${redis.story.pool.max-idle}") int maxIdle,
@Value("${redis.story.pool.min-idle}") int minIdle,
@Value("${redis.story.pool.max-active}") int maxActive,
@Value("${redis.story.pool.max-wait}") long maxWaitMillis,
@Value("${redis.story.db.index}") int db) {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(connectionFactory(hostName, port, password,
maxIdle, minIdle, maxActive, maxWaitMillis, db));
return temple;
}
@Bean(name = "redisStudentTemplate")
public StringRedisTemplate redisStudentTemplate(
@Value("${redis.student.host}") String hostName,
@Value("${redis.student.port}") int port,
@Value("${redis.student.password}") String password,
@Value("${redis.student.pool.max-idle}") int maxIdle,
@Value("${redis.student.pool.min-idle}") int minIdle,
@Value("${redis.student.pool.max-active}") int maxActive,
@Value("${redis.student.pool.max-wait}") long maxWaitMillis,
@Value("${redis.student.db.index}") int db) {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(connectionFactory(hostName, port, password,
maxIdle, minIdle, maxActive, maxWaitMillis, db));
return temple;
}
private RedisConnectionFactory connectionFactory(String hostName, int port,
String password, int maxIdle, int minIdle, int maxActive,
long maxWaitMillis, int db) {
JedisConnectionFactory jedis = new JedisConnectionFactory();
jedis.setHostName(hostName);
jedis.setPort(port);
if (!StringUtils.isEmpty(password)) {
jedis.setPassword(password);
}
jedis.setPoolConfig(poolConfig(maxIdle,minIdle, maxActive, maxWaitMillis,true));
jedis.afterPropertiesSet();
jedis.setDatabase(db);
return jedis;
}
private JedisPoolConfig poolConfig(int maxIdle, int minIdle, int maxActive,
long maxWaitMillis, boolean testOnBorrow) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setTestOnBorrow(testOnBorrow);
return poolConfig;
}
}