Closed thinwonton closed 5 years ago
如何修改tableInfoCache的key生成方式?
当前使用版本
版本:mybatis-plus-boot-starter 2.3.3 springboot 2.0 atomikos
该问题是怎么引起的?
由于多数据源的数据抽取需要事务做保证,所以需要通过atomikos整合多个数据源。我们通过定制多个SqlSessionFactory对应多个数据源。另外,由于涉及淡出的数据抽取,所以,数据来源方和数据目的方的domain实体类是相同的。
那么问题来了。在mybatis-plus初始化的时候,AutoSqlInjector类的nit方法需要映射tableInfo,并把tableInfo的信息缓存到tableInfoCache中,key为domain的entity
下面看下ServiceImpl的insertBatch的实现,然后找下sqlSession是怎么获取的。
ServiceImpl # insertBatch(List entityList, int batchSize) 这里的EntityClass是映射的实体类 => 获取sqlSession => SqlHelper # sqlSessionBatch(Class clazz) 获取当前的sessionFactory => =>
这时,不管entity对应于多少个sqlSessionFactory,都是从缓存中获取同一个sqlSessionFacotry从而获取sqlSession,这时,运行insertBatch,很不辛,会把数据插入错数据库。
我们是否可以通过修改tableInfoCache的key生成方式修改这个问题?该问题存在于所有batch操作,只要存在复用entity都会发生
我觉得你可以在session 上做一个变动,不应定需要每一个数据库连接都去创建一个sessionFactoy,就类似与多数据中的主从意义,其实更不上不同的其实就是数据库连接那块。 你现在的做法应该是: mybatisConfig1->dataSource1->sessionFactory1->mapper1 mybattisconfig2->dataSource2->sessionFactory2->mapper2
其实你可以这样实现: 在数据源中做切换,加一个中间层。这样做法更好我觉得。你可以动态的切换和加入数据源。 mybatsiconfig-> (datasource1/dataSource2)->dynamicDataSource->sessionFactory->mapper
当前使用版本
版本:mybatis-plus-boot-starter 2.3.3 springboot 2.0 atomikos
该问题是怎么引起的?
由于多数据源的数据抽取需要事务做保证,所以需要通过atomikos整合多个数据源。我们通过定制多个SqlSessionFactory对应多个数据源。另外,由于涉及淡出的数据抽取,所以,数据来源方和数据目的方的domain实体类是相同的。 那么问题来了。在mybatis-plus初始化的时候,AutoSqlInjector类的nit方法需要映射tableInfo,并把tableInfo的信息缓存到tableInfoCache中,key为domain的entity 下面看下ServiceImpl的insertBatch的实现,然后找下sqlSession是怎么获取的。 ServiceImpl # insertBatch(List entityList, int batchSize) 这里的EntityClass是映射的实体类 => 获取sqlSession => SqlHelper # sqlSessionBatch(Class clazz) 获取当前的sessionFactory => => 这时,不管entity对应于多少个sqlSessionFactory,都是从缓存中获取同一个sqlSessionFacotry从而获取sqlSession,这时,运行insertBatch,很不辛,会把数据插入错数据库。 我们是否可以通过修改tableInfoCache的key生成方式修改这个问题?该问题存在于所有batch操作,只要存在复用entity都会发生
我觉得你可以在session 上做一个变动,不应定需要每一个数据库连接都去创建一个sessionFactoy,就类似与多数据中的主从意义,其实更不上不同的其实就是数据库连接那块。 你现在的做法应该是: mybatisConfig1->dataSource1->sessionFactory1->mapper1 mybattisconfig2->dataSource2->sessionFactory2->mapper2
其实你可以这样实现: 在数据源中做切换,加一个中间层。这样做法更好我觉得。你可以动态的切换和加入数据源。 mybatsiconfig-> (datasource1/dataSource2)->dynamicDataSource->sessionFactory->mapper
针对多数据源动态切换,这个方案在事务状态下是不适合的,也是有问题的。 可以参考: springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析
没有问题,多数据源动态切换不成功,根本原因是在开启事务情况下会出现这个问题,因为事务开启的时候已经和数据源绑定了,只需要解决在绑定事务之前,切换掉数据就可以。
在 2018年12月18日,下午4:16,huangh notifications@github.com 写道:
当前使用版本
版本:mybatis-plus-boot-starter 2.3.3 springboot 2.0 atomikos
该问题是怎么引起的?
由于多数据源的数据抽取需要事务做保证,所以需要通过atomikos整合多个数据源。我们通过定制多个SqlSessionFactory对应多个数据源。另外,由于涉及淡出的数据抽取,所以,数据来源方和数据目的方的domain实体类是相同的。 那么问题来了。在mybatis-plus初始化的时候,AutoSqlInjector类的nit方法需要映射tableInfo,并把tableInfo的信息缓存到tableInfoCache中,key为domain的entity https://user-images.githubusercontent.com/6516187/49708489-cf553180-fc6a-11e8-8931-a3d9b1277cd6.png 下面看下ServiceImpl的insertBatch的实现,然后找下sqlSession是怎么获取的。 ServiceImpl # insertBatch(List entityList, int batchSize) 这里的EntityClass是映射的实体类 => 获取sqlSession => SqlHelper # sqlSessionBatch(Class clazz) 获取当前的sessionFactory => https://user-images.githubusercontent.com/6516187/49708872-7ab2b600-fc6c-11e8-8406-241be5560f3d.png => https://user-images.githubusercontent.com/6516187/49708895-99b14800-fc6c-11e8-9f86-0b55091cde78.png 这时,不管entity对应于多少个sqlSessionFactory,都是从缓存中获取同一个sqlSessionFacotry从而获取sqlSession,这时,运行insertBatch,很不辛,会把数据插入错数据库。 我们是否可以通过修改tableInfoCache的key生成方式修改这个问题?该问题存在于所有batch操作,只要存在复用entity都会发生
我觉得你可以在session 上做一个变动,不应定需要每一个数据库连接都去创建一个sessionFactoy,就类似与多数据中的主从意义,其实更不上不同的其实就是数据库连接那块。 你现在的做法应该是: mybatisConfig1->dataSource1->sessionFactory1->mapper1 mybattisconfig2->dataSource2->sessionFactory2->mapper2
其实你可以这样实现: 在数据源中做切换,加一个中间层。这样做法更好我觉得。你可以动态的切换和加入数据源。 mybatsiconfig-> (datasource1/dataSource2)->dynamicDataSource->sessionFactory->mapper
针对多数据源动态切换,这个方案在事务状态下是不适合的,也是有问题的。 可以参考: springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析 https://my.oschina.net/thinwonton/blog/2962391 — You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/baomidou/mybatis-plus/issues/685#issuecomment-448150762, or mute the thread https://github.com/notifications/unsubscribe-auth/Aox251LiW5SZL5KuCKtBD8YhTXqB-Q5Cks5u6LJlgaJpZM4ZKj3a.
没有问题,多数据源动态切换不成功,根本原因是在开启事务情况下会出现这个问题,因为事务开启的时候已经和数据源绑定了,只需要解决在绑定事务之前,切换掉数据就可以。 … 在 2018年12月18日,下午4:16,huangh @.***> 写道: 当前使用版本 版本:mybatis-plus-boot-starter 2.3.3 springboot 2.0 atomikos 该问题是怎么引起的? 由于多数据源的数据抽取需要事务做保证,所以需要通过atomikos整合多个数据源。我们通过定制多个SqlSessionFactory对应多个数据源。另外,由于涉及淡出的数据抽取,所以,数据来源方和数据目的方的domain实体类是相同的。 那么问题来了。在mybatis-plus初始化的时候,AutoSqlInjector类的nit方法需要映射tableInfo,并把tableInfo的信息缓存到tableInfoCache中,key为domain的entity https://user-images.githubusercontent.com/6516187/49708489-cf553180-fc6a-11e8-8931-a3d9b1277cd6.png 下面看下ServiceImpl的insertBatch的实现,然后找下sqlSession是怎么获取的。 ServiceImpl # insertBatch(List entityList, int batchSize) 这里的EntityClass是映射的实体类 => 获取sqlSession => SqlHelper # sqlSessionBatch(Class clazz) 获取当前的sessionFactory => https://user-images.githubusercontent.com/6516187/49708872-7ab2b600-fc6c-11e8-8406-241be5560f3d.png => https://user-images.githubusercontent.com/6516187/49708895-99b14800-fc6c-11e8-9f86-0b55091cde78.png 这时,不管entity对应于多少个sqlSessionFactory,都是从缓存中获取同一个sqlSessionFacotry从而获取sqlSession,这时,运行insertBatch,很不辛,会把数据插入错数据库。 我们是否可以通过修改tableInfoCache的key生成方式修改这个问题?该问题存在于所有batch操作,只要存在复用entity都会发生 我觉得你可以在session 上做一个变动,不应定需要每一个数据库连接都去创建一个sessionFactoy,就类似与多数据中的主从意义,其实更不上不同的其实就是数据库连接那块。 你现在的做法应该是: mybatisConfig1->dataSource1->sessionFactory1->mapper1 mybattisconfig2->dataSource2->sessionFactory2->mapper2 其实你可以这样实现: 在数据源中做切换,加一个中间层。这样做法更好我觉得。你可以动态的切换和加入数据源。 mybatsiconfig-> (datasource1/dataSource2)->dynamicDataSource->sessionFactory->mapper 针对多数据源动态切换,这个方案在事务状态下是不适合的,也是有问题的。 可以参考: springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析 https://my.oschina.net/thinwonton/blog/2962391 — You are receiving this because you commented. Reply to this email directly, view it on GitHub <#685 (comment)>, or mute the thread https://github.com/notifications/unsubscribe-auth/Aox251LiW5SZL5KuCKtBD8YhTXqB-Q5Cks5u6LJlgaJpZM4ZKj3a.
后面的讨论还是偏离了前面的问题,就是需要使用mybatis-plus的批量插入、更新操作
请自行处理,建议重写 sqlSessionBatch
方法获取你需要的 sqlsession
我这边刚遇到了,是因为不规范mapperLocations通配了所有的mapper下xml,限制指定对应目录就行
当前使用版本
版本:mybatis-plus-boot-starter 2.3.3 springboot 2.0 atomikos
该问题是怎么引起的?
由于多数据源的数据抽取需要事务做保证,所以需要通过atomikos整合多个数据源。我们通过定制多个SqlSessionFactory对应多个数据源。另外,由于涉及淡出的数据抽取,所以,数据来源方和数据目的方的domain实体类是相同的。
那么问题来了。在mybatis-plus初始化的时候,AutoSqlInjector类的nit方法需要映射tableInfo,并把tableInfo的信息缓存到tableInfoCache中,key为domain的entity
下面看下ServiceImpl的insertBatch的实现,然后找下sqlSession是怎么获取的。
ServiceImpl # insertBatch(List entityList, int batchSize) 这里的EntityClass是映射的实体类
=>
获取sqlSession
=> SqlHelper # sqlSessionBatch(Class clazz)
获取当前的sessionFactory
=>
=>
这时,不管entity对应于多少个sqlSessionFactory,都是从缓存中获取同一个sqlSessionFacotry从而获取sqlSession,这时,运行insertBatch,很不辛,会把数据插入错数据库。
我们是否可以通过修改tableInfoCache的key生成方式修改这个问题?该问题存在于所有batch操作,只要存在复用entity都会发生