SpringBoot2.0.6+Eureka整合Seata0.8.0升级到1.3.0踩坑指南

我们这一节主要讲的是seata升级后的主要修改,至于seata的基本部署可以参考我之前的随笔。

一开始我在升级SpringBoot版本之后,seata就突然启动不起来了,报了下面的错:

no available service 'null' found, please make sure registry config correct
这个报错其实就是你的客户端找不到你的seata服务器,因为升级之后配置参数有变化,所以我也对seata进行了改造升级。

Seata服务器配置:

file.conf:

transaction log store, only used in seata-server

service{
#"./my_test_tx_group"这个可以自定义,value对应你eureka注册的application-name
vgroup_mapping.my_test_tx_group = "seata-server"
default.grouplist = "127.0.0.1:8091"
disableGlobalTransaction = false
}

registry.conf:

eureka {
serviceUrl = "http://192.168.1.186:8000/eureka/"
application = "seata-server"
weight = "1"
}

客户端配置:

Datasource代理

Caused by: io.seata.common.exception.ShouldNeverHappenException: Auto proxy of DataSource can't be enabled as you've created a DataSourceProxy bean.Please consider removing DataSourceProxy bean or disabling auto proxy of DataSource.
at io.seata.spring.annotation.datasource.SeataDataSourceBeanPostProcessor.postProcessBeforeInitialization(SeataDataSourceBeanPostProcessor.java:60) ~[seata-all-1.1.0.jar:1.1.0]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:416) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1686) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ~[spring-beans-5.0.10.RELEASE.jar:5.0.10.RELEASE]
... 66 common frames omitted

在1.1.0版本升级之后,seata不支持手动代理,所以只需创建普通的数据源bean就行:

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}

pom依赖



com.alibaba.cloud
spring-cloud-starter-alibaba-seata


io.seata
seata-spring-boot-starter




io.seata
seata-spring-boot-starter
1.3.0

yml配置

我们可以删掉file.conf和registry.conf这两个配置文件了,直接用yml就可以配置seata:

seata配置

seata:
enabled: true
# 你的服务名称
application-id: ${spring.application.name}
#这里的名字与seata服务端的file.conf中vgroup_mapping.my_test_tx_group = "seata-server"相同
tx-service-group: my_test_tx_group
# 开启数据源自动代理
enable-auto-data-source-proxy: true
# 可以指定动态代理
# use-jdk-proxy: false
service:
vgroup-mapping:
#这里对应端的file.conf中vgroup_mapping.my_test_tx_group = "seata-server"
my_test_tx_group: seata-server
grouplist:
default: 127.0.0.1:8091
config:
type: file
file:
name: file.conf
# Eureka配置
registry:
type: eureka
eureka:
application: default
serviceUrl: http://192.168.1.186:8000/eureka/
weight: 1

这里再补充一点,如果出现以下异常:

Caused by: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='createTime', mode=IN, javaType=class java.lang.Object, jdbcType=TIMESTAMP, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Error
	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:89)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:93)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)
	at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
	at com.sun.proxy.$Proxy385.query(Unknown Source)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
	... 171 more
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Error
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:55)
	at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)
	... 188 more
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType TIMESTAMP . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Error
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:55)
	at org.apache.ibatis.type.UnknownTypeHandler.setNonNullParameter(UnknownTypeHandler.java:45)
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:53)
	... 189 more
Caused by: java.sql.SQLException: Error
	at com.alibaba.druid.pool.DruidDataSource.handleConnectionException(DruidDataSource.java:1569)
	at com.alibaba.druid.pool.DruidPooledConnection.handleException(DruidPooledConnection.java:133)
	at com.alibaba.druid.pool.DruidPooledStatement.checkException(DruidPooledStatement.java:77)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.setTimestamp(DruidPooledPreparedStatement.java:416)
	at io.seata.rm.datasource.AbstractPreparedStatementProxy.setTimestamp(AbstractPreparedStatementProxy.java:201)
	at org.apache.ibatis.type.DateTypeHandler.setNonNullParameter(DateTypeHandler.java:33)
	at org.apache.ibatis.type.DateTypeHandler.setNonNullParameter(DateTypeHandler.java:28)
	at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:53)
	... 191 more
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.PreparedStatement.setTimestamp(PreparedStatement.java:4241)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.setTimestamp(DruidPooledPreparedStatement.java:414)
	... 195 more

这是因为seata代理数据源的原因,只有操作Date类型的时候会出现这个错误,这跟mysql-connection的版本有关系,只需把版本换到5.1.39即可。

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>

以上就是升级后的主要修改,如有问题可留言,大家一起学习。

posted @ 2020-11-21 15:47  Conwie  阅读(1349)  评论(0)    收藏  举报