Springboot+Neo4j+Mysql多数据源配置(一)
2 年前
· 来自专栏
Springboot+Neo4j
我们在做项目时,有时会同时用到关系型数据库和图数据库,这个一般根据业务以及技术选型来定,如果同时用到了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) {