我们这一节主要讲的是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依赖
<!--seata-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
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>
以上就是升级后的主要修改,如有问题可留言,大家一起学习。