ShardingJdbc:SpringbootはShardingSphere、データソース、実装が容易なトランザクション管理にまたがる単一のサービスを統合

以下の実験を読む前に:公式コンテンツ分散トランザクションのサポートをお読みくださいhttps://shardingsphere.apache.org/document/current/cn/features/transaction/を

テストの後、データ・ソース間の単一のサービス、あなたは普通のJDBC場合は希望のように、shardingJdbcトランザクションを使用しています。実験バージョンshrading-JDBC-春ブートスターターver.3.1.0

1)スタートクラス(提供:POM組み込まばねブートスタータJDBCまたはスプリングブートスタータDATA-導入 JPA 依存し、クラス注釈オープントランザクション・マネージャの使用を開始 @ EnableTransactionManagement )。

パッケージcom.chong.mcspcshardingdbtable; 

輸入com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure。
輸入org.springframework.boot.SpringApplication。
輸入org.springframework.boot.autoconfigure.SpringBootApplication。
輸入org.springframework.cloud.client.discovery.EnableDiscoveryClient;
輸入org.springframework.context.annotation.ComponentScan;
輸入org.springframework.transaction.annotation.EnableTransactionManagement; 

@SpringBootApplication(除外 = {DruidDataSourceAutoConfigure。クラス})
@EnableDiscoveryClient @EnableTransactionManagement

@ComponentScan(basePackages = { "com.chong.common"、 "com.chong.mcspcshardingdbtable" })
 パブリック クラスMcSpcShardingDbTableApplication { 

    公共 静的 ボイドメイン(文字列[]引数){ 
        SpringApplication.run(McSpcShardingDbTableApplication。クラス、引数)。
    } 

}

 

トランザクションのコメントを導入する2)サービスメソッド

    @Transactional 
    パブリックリスト<BizMember> saveMembersToMutliDbs(文字列名、文字列NAME2){ 
        BizMember MEMBER1 = newMember()。
        member1.setFullName(名); 
        member1.setGender( 1 )。// 存放到mcspcsharding1  
        BizMember member2 = newMember()。
        member2.setFullName(NAME2)。
        member2.setGender( 2 ); //存放到mcspcsharding0  
        一覧 <BizMember>メンバー= 新しい ArrayListを<> (); 
        memberList.add(memberRepository.save(MEMBER1))。
        memberList.add(member2= memberRepository.save(member2))。
        返すメンバーを。
    }

 

3)試験設定データベース:mcspcsharding0配置性別= 2データ; mcspcsharding1データ配置性別= 1。

 

 

4)実験手順:郵便配達、データ配信、要件を満たすNAME1、NAME2要件(長いデータ)を満たしていません。残りのフォーマットPOST:URL / {NAME1} / {} NAME2

5)結果:

    A.は、最初の文は、第二の声明のNAME2挿入が失敗し、失敗の原因パラメータデータベースの内容の長さがカラムNAME2限界の長さを超えるメンバーNAME1を挿入することによって行われることがわかります。

    B.確認データベースレコード内の実際のストレージ、およびデータベースに挿入されていないNAME2データNAME1。これは、データソース間のトランザクション制御を達成するために簡単な注釈二つのことを証明しています。

       TODO:トランザクションのコミットとshardingjdbcで2つのライブラリをどのように達成するかのロールバックメカニズムは、研究者が時間を見つける必要があります。

コンソールの内容:

2020年2月29日19:10:47.962 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere- SQL:ルールタイプ:シャーディング
 2020年2月29日19:10:47.966 INFO 24132 --- [IO- 9060-EXEC-10] ShardingSphere-SQL:ロジックSQL:mc_memberへの挿入(年齢、CREATE_TIME、CREATE_USER、FULL_NAME、性別、is_delete、UPDATE_TIME、update_user、ID)の値(、、、、、、??????? 、?、?)
2020年2月29日19:10:47.971 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere-SQL:のSQLStatement:InsertStatement(スーパー= DMLStatement(スーパー= io.shardingsphere.core.parsing.parser.sql。 dml.insert.InsertStatement@68a542c3)、列=【コラム(名前=年齢、tableNameの= mc_member)、列(名前= CREATE_TIME、tableNameの= mc_member)、列(名前= CREATE_USER、tableNameの= mc_member)、列(名前= FULL_NAME 、tableNameの= mc_member)、カラム(名称=性別、tableNameの= mc_member)、カラム(名称= is_delete、tableNameの= mc_member)、カラム(名称= UPDATE_TIME、tableNameの= mc_member)、カラム(名称= update_user、tableNameの= mc_member)カラム(名称= ID、tableNameの= mc_member)]、generatedKeyConditions = []、insertValues = insertValues(insertValues = [InsertValue(タイプ= VALUES、式=(?、?、?、?、?、?、?、?、? )、parametersCount = 9)])、columnsListLastPosition = 112、generateKeyColumnIndex = -1、insertValuesListLastPosition = 148)
2020年2月29日19:10:47.976 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere-SQL:実際のSQL:mc_member0にMS1 :::インサート(年齢、CREATE_TIME、CREATE_USER、FULL_NAME、性別、is_delete 、UPDATE_TIME、update_user、ID)の値(、、、、、、、、)::: [45、2020年2月29日19:?????????09:41.749、245、name12、1 、0、NULL、NULL、4041594688888832] 
休止状態:mc_memberへの挿入(年齢、CREATE_TIME、CREATE_USER、FULL_NAME、性別、is_delete、UPDATE_TIME、update_user、ID)の値(、、、、、、、??????? ?、?)
 2020年2月29日19:10:47.999 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere- SQL:ルールタイプ:シャーディング
2020年2月29日19:10:48.001 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere-SQL:ロジックSQL:mc_member(年齢、CREATE_TIME、CREATE_USER、FULL_NAME、性別、is_deleteへの挿入、UPDATE_TIME、update_user 、ID)の値(?、?、?、?、?、?、?、?、?)
2020年2月29日19:10:48.002 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere-SQL:のSQLStatement:InsertStatement(スーパー= DMLStatement(スーパー= io.shardingsphere.core.parsing.parser.sql。 dml.insert.InsertStatement@68a542c3)、列=【コラム(名前=年齢、tableNameの= mc_member)、列(名前= CREATE_TIME、tableNameの= mc_member)、列(名前= CREATE_USER、tableNameの= mc_member)、列(名前= FULL_NAME 、tableNameの= mc_member)、カラム(名称=性別、tableNameの= mc_member)、カラム(名称= is_delete、tableNameの= mc_member)、カラム(名称= UPDATE_TIME、tableNameの= mc_member)、カラム(名称= update_user、tableNameの= mc_member)カラム(名称= ID、tableNameの= mc_member)]、generatedKeyConditions = []、insertValues = insertValues(insertValues = [InsertValue(タイプ= VALUES、式=(?、?、?、?、?、?、?、?、? )、parametersCount = 9)])、columnsListLastPosition = 112、generateKeyColumnIndex = -1、insertValuesListLastPosition = 148)
2020年2月29日19:10:48.002 INFO 24132 --- [IO-9060-EXEC-10] ShardingSphere-SQL:実際のSQL:mc_member0にMS0 :::インサート(年齢、CREATE_TIME、CREATE_USER、FULL_NAME、性別、is_delete 、UPDATE_TIME、update_user、ID)の値(、、、、、、、、)::: [73、2020年2月29日19:?????????09:41.75、873、name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1name1、2 、0、NULL、NULL、4041594693083136] 
2020年2月29日19:10:48.020にohengine.jdbc.spi.SqlExceptionHelper IO-9060-EXEC-10] [--- 24132に警告:SQLエラー:1406のSQLState:22001
2020年2月29日19:10:48.020 ERROR 24132 --- [IO-9060-EXEC-10] ohengine.jdbc.spi.SqlExceptionHelper:データの切り捨て:データ長すぎる行で列'FULL_NAME'の1 
2020-02- 29 19:10:48.043 ERROR 24132 --- [IO-9060-EXEC-10] oaccC [[[/] [のDispatcherServlet]。。。のServlet.service()のための経路に関連してサーブレット【のDispatcherServlet] []投げ例外[リクエストの処理に失敗しました。ネストされた例外はorg.springframework.dao.DataIntegrityViolationExceptionです:ステートメントを実行することができませんでした。SQL [N / A]。ネストされた例外はorg.hibernate.exception.DataExceptionです:根本原因で]ステートメントを実行することができませんでした

com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:データの切り捨て:データあまりにも長い ために、行1の列「FULL_NAME」
    com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:で 104)〜[MySQLのコネクタからJava - 8.0.19.jar:8.0.19 ] 
    com.mysql.cj.jdbc.ClientPreparedStatementました。 executeInternal(ClientPreparedStatement.java: 953)〜[mysqlのコネクタ-javaの-8.0.19.jar:8.0.19 ] 
    com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternalで(ClientPreparedStatement.java: 1092)〜[mysqlのコネクタ-java-8.0.19.jar:8.0.19 ] 
    com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternalで(ClientPreparedStatement.java: 1040)〜[mysqlのコネクタ-javaの-8.0.19.jar:8.0.19]

おすすめ

転載: www.cnblogs.com/chongpf/p/12393924.html
おすすめ