Springboot+Neo4j+Mysql多数据源配置(一)

我们在做项目时,有时会同时用到关系型数据库和图数据库,这个一般根据业务以及技术选型来定,如果同时用到了Neo4j,Mysql两种数据库,我们的数据源应该怎么配置呢?下面跟着文章我们一点一点揭开面纱图片

mysql我们采用mybatis框架

首先看下我们pom.xml文件的引用

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <!--neo4j-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
        </dependency>
        <!-- 扫描路径,版本为2.21b不然的话在服务器上 neo4j mapper不生效 -->
        <dependency>
            <groupId>io.github.lukehutch</groupId>
            <artifactId>fast-classpath-scanner</artifactId>
            <version>2.21</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.0.1-jre</version>
        </dependency>
        <!--ftp-->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.9.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
<dependency>  
 <groupId>io.github.lukehutch</groupId>  
 <artifactId>fast-classpath-scanner</artifactId>  
 <version>2.21</version>  
</dependency>

其中这段是最容易忽视的,单独配置neo4j或者MySQL都是没有问题的,在idea单独跑也是没问题的,但如果neo4j和mysql一起使用必须配置这里,因为他默认是用2.18版本,对应的找不到neo4j对应mapper的路径,所以我们这里加入2.21版本的配置

接着修改我们的配置文件加入mysql地址

spring:
  datasource:
    industrygraph:
      url: jdbc:mysql://127.0.0.1:3306/industry\_graph?useSSL=false&autoReconnect=true&failOverReadOnly=false&characterEncoding=utf-8&useUnicode=true&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
      username: myang
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
  data:
    neo4j:
      uri: bolt://127.0.0.1:7687
      username: neo4j
      password: 123456

接着配置我们的mysql的数据源

/\*\*
 \* @Author Created by YangMeng on 2021/3/3.
 \*/
@Configuration
@MapperScan(basePackages = {"com.abcft.industrygraphmanagement.dao.mysql"}, sqlSessionTemplateRef = "industrygraphSqlSessionTemplate")
public class DatabaseSourceConfig {
    @Bean(name = "industrygraphDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.industrygraph")
    public DataSource industrygraphDataSource() {
        //指定使用DruidDataSource
        return DataSourceBuilder.create().type(DruidDataSource.class).build();
    }

    @Bean
    public SqlSessionFactory industrygraphSqlSessionFactory(@Qualifier("industrygraphDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/graph/\*.xml"));
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    @Bean
    public DataSourceTransactionManager industrygraphTransactionManager(@Qualifier("industrygraphDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public SqlSessionTemplate industrygraphSqlSessionTemplate(@Qualifier("industrygraphSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

因为neo4j也是支持事务的,所以我们在事务这块要区分开mysql的事务和neo4j的事务,通过@EnableTransactionManagement 来开启事务,然后我们加入以下配置

@Aspect
@Configuration
@EnableTransactionManagement
@Slf4j
public class Neo4jConfig {
    /\*\*
     \* 定义neo4j事务
     \*
     \* @param sessionFactory
     \* @return
     \*/
    @Bean("neo4jTransactionManager")
    public Neo4jTransactionManager neo4jTransactionManager(SessionFactory sessionFactory) {
        return new Neo4jTransactionManager(sessionFactory);
    }
    /\*\*
     \* 定义mysql 事务
     \*
     \* @param emf
     \* @return
     \*/
    @Bean("transactionManager")
    public JpaTransactionManager jpaTransactionManager(EntityManagerFactory emf) {
        return new JpaTransactionManager(emf);
    }
}

然后我们在service层使用的时候指定相应的事务就行了

    @Override
    @Transactional(transactionManager = "neo4jTransactionManager")
    public void updateCompanyEntry(CompanyEntryCondition companyEntryCondition) throws Exception {
    }

其实neo4j和mysql配置主要在于事务的配置和mapper路径的查找,希望本篇读完大家可以亲手配置跑一下程序试试,我这里就不贴出来。

在实际的项目中业务可能比较复杂,涉及到数据库混合操作,比如一个方法里既有neo4j的更新又有mysql的更新,这样就涉及了多事务共同使用,下篇文章我们来说说批量事务怎么定义和提交,今天就到这里了,拜拜图片
       有疑问请点赞和留言哈图片,我会及时回复。



- 本期完 -

为方便看最新内容,记得关注哦!

图片

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值