当前位置: 代码迷 >> 综合 >> SpringBoot-redis、mysql、JPA、mongodb多数据源配置
  详细解决方案

SpringBoot-redis、mysql、JPA、mongodb多数据源配置

热度:32   发布时间:2023-10-19 01:57:05.0

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;

    }

}

  相关解决方案