如何快速同步HANA数据到其它数据库?

如何快速同步HANA数据到其它数据库?,第1张

两条途径1)免费,但不是很靠谱。github 开源代码自己搜一下,有HANA 到 mysql的代码。仔细调试下,秒级估计很悬,但分钟级别的数据量不大的情况下还是有希望的。2)收费,但功能很强大。有第三方的工具专门干这个事情的,而且是log base的CDC,不需要在SAP和Hana 上安装任何agent。 同步速度基本都在1秒以内。同步目标可以是常见的数据库(Oracle ,DB2,SQL server , PostgreSql) 数据仓库,数据湖,kafka,各种云平台(AWS,Google,Azure)阿里等各种数据中台。

在方法中,使用了hana数据源从hana数据库中查出数据,然后将数据写到mysql数据库中,对数据库进行修改 *** 作时,我们一般会添加事务回滚的 *** 作,以便程序出错时可以还原数据库。

问题:

在方法中添加能使程序异常的代码(比如:int i = 1/0)进行测试,并在方法中贴上以下注解:

@Transactional(rollbackFor = Exception.class)

复制

但是发现事务并没有回滚

检查了项目的配置, 两个数据源配置了事务管理器

hana数据源配置:

import javax.sql.DataSource

import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean

import org.apache.ibatis.session.SqlSessionFactory

import org.mybatis.spring.SqlSessionTemplate

import org.mybatis.spring.annotation.MapperScan

import org.springframework.beans.factory.annotation.Qualifier

import org.springframework.boot.jdbc.DataSourceBuilder

import org.springframework.context.annotation.Bean

import org.springframework.context.annotation.Configuration

import org.springframework.context.annotation.Primary

import org.springframework.core.io.support.PathMatchingResourcePatternResolver

import org.springframework.jdbc.datasource.DataSourceTransactionManager

import top.ibase4j.core.Constants

import top.ibase4j.core.util.PropertiesUtil

import top.ibase4j.core.util.SecurityUtil

@Configuration

@MapperScan(basePackages = "com.xxx.mapper.hana",sqlSessionTemplateRef ="hanaSqlSessionTemplate")

public class HanaDataSourceConfig {

/**创建数据源*/

@Bean(name = "hanaDataSource")

@Primary

public DataSource gethanaDataSource() {

DataSource build = DataSourceBuilder.create()

.driverClassName(PropertiesUtil.getString("hana.driverClassName"))

.url(PropertiesUtil.getString("hana.url"))

.username(PropertiesUtil.getString("hana.username"))

.password(SecurityUtil.decryptDes(PropertiesUtil.getString("hana.password"), Constants.DB_KEY.getBytes()))

.build()

return build

}

@Bean(name = "hanaSqlSessionFactory")

@Primary

public SqlSessionFactory hanaSqlSessionFactory(@Qualifier("hanaDataSource") DataSource dataSource) throws Exception {

MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean()

bean.setDataSource(dataSource)

//设置mapper配置文件

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/hana/*.xml"))

return bean.getObject()

}

/**创建事务管理器*/

@Bean("hanaTransactionManger")

@Primary

public DataSourceTransactionManager hanaTransactionManger(@Qualifier("hanaDataSource") DataSource dataSource){

return new DataSourceTransactionManager(dataSource)

}

/**创建SqlSessionTemplate*/

@Bean(name = "hanaSqlSessionTemplate")

@Primary

public SqlSessionTemplate hanaSqlSessionTemplate(@Qualifier("hanaSqlSessionFactory") SqlSessionFactory sqlSessionFactory){

return new SqlSessionTemplate(sqlSessionFactory)

}

}

复制

mysql数据源配置:

import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean

import org.apache.ibatis.plugin.Interceptor

import org.apache.ibatis.session.SqlSessionFactory

import org.mybatis.spring.SqlSessionTemplate

import org.mybatis.spring.annotation.MapperScan

import org.springframework.beans.factory.annotation.Qualifier

import org.springframework.boot.jdbc.DataSourceBuilder

import org.springframework.context.annotation.Bean

import org.springframework.context.annotation.Configuration

import org.springframework.context.annotation.EnableAspectJAutoProxy

import org.springframework.core.io.support.PathMatchingResourcePatternResolver

import org.springframework.jdbc.datasource.DataSourceTransactionManager

import org.springframework.transaction.annotation.EnableTransactionManagement

import top.ibase4j.core.util.PropertiesUtil

import javax.annotation.Resource

import javax.sql.DataSource

@Configuration

@MapperScan(basePackages = "com.xxx.mapper.mysql",sqlSessionTemplateRef ="mysqlSqlSessionTemplate")

public class MysqlDataSourceConfig {

@Resource

private MybatisPlusConfig mybatisPlusConfig

/**创建数据源*/

@Bean(name = "mysqlDataSource")

public DataSource getmysqlDataSource() {

DataSource build = DataSourceBuilder.create()

.driverClassName(PropertiesUtil.getString("druid.default.driverClassName"))

.url(PropertiesUtil.getString("druid.writer.default.url"))

.username(PropertiesUtil.getString("druid.writer.default.username"))

.password(PropertiesUtil.getString("druid.writer.default.password"))

.build()

return build

}

@Bean(name = "mysqlSqlSessionFactory")

public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {

MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean()

bean.setDataSource(dataSource)

//设置mapper配置文件

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml"))

Interceptor[] interceptors = {

mybatisPlusConfig.paginationInterceptor(),

mybatisPlusConfig.performanceSonInterceptor()

}

bean.setPlugins(interceptors)

return bean.getObject()

}

/**创建事务管理器*/

@Bean("mysqlTransactionManger")

public DataSourceTransactionManager mysqlTransactionManger(@Qualifier("mysqlDataSource") DataSource dataSource){

return new DataSourceTransactionManager(dataSource)

}

/**创建SqlSessionTemplate*/

@Bean(name = "mysqlSqlSessionTemplate")

public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){

return new SqlSessionTemplate(sqlSessionFactory)

}

}

复制

由于默认的数据源是hana数据源,但是现在我们要将mysql的事务进行回滚,如果不将默认的事务管理器设置mysql对应的事务管理器为默认的话, 事务回滚将不起作用。

因此,可以添加配置类,以配置默认的事务管理器为mysql的,配置类要实现TransactionManagementConfigurer

/**

*

* 将mysql数据源的事务管理器设置为默认的事务

*/

@Configuration

public class SpecifyDefaultTransactionManagerConfig implements TransactionManagementConfigurer {

@Autowired

private MysqlDataSourceConfig mysqlDataSourceConfig

@Override

public PlatformTransactionManager annotationDrivenTransactionManager() {

return mysqlDataSourceConfig.mysqlTransactionManger(mysqlDataSourceConfig.getmysqlDataSource())

}

复制

再次进行测试,事务将回滚成功

如果不想添加配置类,可以在注解中标明使用的是哪个事务管理器

这里我们要用的是mysql的,因此可以这样配置

@Transactional(value = "mysqlTransactionManger",rollbackFor = Exception.class)

复制

value的值就是事务管理器bean的名称

spring boot

三星电视

精选推荐

广告

springboot多数据源即分布式事务解决方案

79下载·0评论

2018年10月16日

SSM多数据源配置事务回滚处理

2777阅读·0评论·1点赞

2019年1月15日

MySQL 多库事务回滚

284阅读·0评论·0点赞

2022年10月23日

Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

10下载·0评论

2021年7月21日

Spring 事务

165阅读·0评论·0点赞

2020年4月14日

java多数据源回滚_Spring多数据源事务

1053阅读·0评论·0点赞

2021年3月10日

Springboot多数据源 解决事务回滚失效

3004阅读·6评论·2点赞

2021年8月6日

springboot 多数据源 添加事务,事务回滚

1125阅读·4评论·0点赞

2021年12月1日

dynamic-datasource多数据源的配置使用(读写分离、事务的回滚)

4146阅读·3评论·4点赞

2022年1月26日

Spring Boot项目多数据源事务不生效的问题

2641阅读·0评论·8点赞

2021年10月15日

Springboot集成SpringJDBC多数据源事务回滚(二)

hana数据库与数据仓库区别分别是:

数据库(Database)是:

1、相对复杂的表格结构,存储结构相对紧致,少冗余数据。

2、读和写都有优化。

3、相对简单的read/write query,单次作用于相对的少量数据。

数据仓库(Datawarehouse)是:

1、相对简单的(Denormalized)表格结构,存储结构相对松散,多冗余数据。

2、一般只是读优化。

3、相对复杂的read query,单次作用于相对大量的数据(历史数据)。

并且数据库 Database (Oracle, Mysql, PostgreSQL)主要用于事务处理,数据仓库 Datawarehouse (Amazon Redshift, Hive)主要用于数据分析

数据仓库的弱势之处是:

并不是所有的读 *** 作,数据仓库一直都有优势。比如在如下两种情况时,数据仓库的读表现并不如数据库:

1、在对小量数据进行读取 *** 作的时候,由于数据仓库要进行找Node的location之类的预运算,整体效率上反倒不如数据库。

2、如果读取 *** 作的目标不是主键(PrimaryKey)或者分配键(PartitionKey),那么数据仓库的查询也需要进行全局扫描,效率上就不好说是否胜过数据库了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8660071.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存