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依賴

<!--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>

以上就是升級后的主要修改,如有問題可留言,大家一起學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM