blog

ShardingSphere 4.x FAQ

1.SQLが正しく実行されない場合のデバッグ方法は? Sharding-ProxyおよびSharding-JDBCバージョン1.5.0以降では、sql.showの設定が提供され、解析コンテキストと書き...

Sep 7, 2020 · 6 min. read
シェア

ShardingSphereでSQLが正しく実行されない場合、どのようにデバッグすればよいですか?

答えてください:

Sharding-ProxyおよびSharding-JDBCバージョン1.5.0以降では、sql.show設定が提供され、解析コンテキストと書き換えられたSQL、および最終的にルーティングされたデータソースの詳細をinfoログに出力することができます。 sql.show設定はデフォルトではオフになっています。

ソースコードを読むとコンパイルエラーが出るのはなぜですか?

答えてください:

Spring名前空間を使用しているときにxsdが見つからない?

答えてください:

Spring Namespace Usage Specificationでは、xsdファイルを公開アドレスにデプロイすることを義務付けていませんが、一部のユーザーのニーズを考慮し、関連するxsdファイルはShardingSphereの公式ウェブサイトにもデプロイされます。

文字列値のプレースホルダ...を解決できない例外?

答えてください:

行式の識別子は->{...}でも使えますが、前者はSpring独自のプロパティファイルのプレースホルダと衝突します。しかし、前者はSpring独自のプロパティファイルのプレースホルダと衝突するので、Spring環境での行式識別子には$->{...}を使うことを推奨します。.

なぜインライン式は浮動小数点数を返すのですか?

答えてください:

Javaで整数を除算した結果は整数ですが、インライン式のGroovy構文では異なり、整数を除算した結果は浮動小数点数になります。 整数の除算結果を得るには、A/BをA.intdiv(B)に変更する必要があります。

データベースの一部だけがライブラリとテーブルに分割されている場合、ライブラリとテーブルに分割されていないテーブルもシャーディングルールで設定する必要がありますか?

答えてください:

はい。ShardingSphereは複数のデータ・ソースを1つの論理データ・ソースに統合するからです。そのため、ライブラリとテーブルの部分がなくても、ShardingSphereはシャーディング・ルールを構成しないと、どのデータ・ソースにルーティングするかを正確に判断できません。 しかし、ShardingSphereは、構成を簡素化するための2つの回避策を提供しています。

方法 1: default-data-source を構成します。この場合、シャーディング・ルールで構成することなく、デフォルト・データ・ソースのテーブルを構成できます。

アプローチ2:シャーディングとテーブル共有に関与しないデータ・ソースをShardingSphereから独立させ、アプリケーションで複数のデータ・ソースを使用して、シャーディングと非シャーディングのシナリオを別々に処理します。

ShardingSphereは、分散自己インクリメント・プライマリ・キーに加えて、ネイティブ自己インクリメント・プライマリ・キーをサポートできますか?

答え: はい、可能です。つまり、ネイティブのセルフインクリメント主キーをスライスキーとして同時に使用することはできません。

ShardingSphere はデータベースのテーブル構造を知らず、ネイティブのインクリメンタル主キーが元の SQL に含まれていないため、ShardingSphere はこのフィールドをスライス・フィールドとして解決できません。自己インクリメント主キーがスライス・キーでない場合、それは問題ではなく、通常通り返されます。自己インクリメント主キーがスライス・キーとしても使用されている場合、ShardingSphereはそのスライス値を解決できず、結果としてSQLが複数のテーブルにルーティングされ、アプリケーションの正しさに影響を与えます。

ネイティブのインクリメンタルキーは、INSERT SQLが最終的に1つのテーブルにルーティングされなければならないという前提条件を返すため、複数のテーブルを返すINSERT SQLに直面した場合、インクリメンタルキーはゼロを返します。

SingleKeyTableShardingAlgorithmをLongジェネリック型で指定したところ、ClassCastExceptionが発生しました。

答えてください:

あなたは、データベースのテーブル内のフィールドとフィールドの種類のスライスアルゴリズムが同じであることを確認する必要があります、次のように:フィールドの種類のデータベースはint型(11)であり、汎用型の対応するスライスタイプは整数でなければなりません、あなたはLongの型を設定する必要がある場合は、データベース内のフィールドの型がbigintであることを確認してください。

SQLSeverとPostgreSQLを使用する場合、集約カラムがエイリアスされていないと例外がスローされますか?

答えてください:

SQLServerとPostgreSQLは、名前を変更した未解析の集約カラムをフェッチします。例えば、以下のSQLです:

SELECT SUM(num), SUM(num2) FROM tablexxx;

SQLServer は空の文字列の合計を持つ列を取得し、PostgreSQL は空の合計と sum(2) を持つ列を取得します。このため、ShardingSphere は適切な列を見つけることができず、結果がマージされる際にエラーとなります。

正しいSQLの書き方は

SELECT SUM(num) AS sum_num, SUM(num2) AS sum_num2 FROM tablexxx;

答えてください:

上記の問題を解決するには、2つの方法があります:1.スタートアップJVMパラメータ"-oracle.jdbc.J2EE13Compliant=true "を設定する 2.プロジェクトの初期化でコードを通してSystem.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true");

理由は以下の通り。

com.dangdang.ddframe.rdb.sharding.merger.orderby.OrderByValue#getOrderValues()メソッドは以下の通りです。

 private List<Comparable<?>> getOrderValues() throws SQLException {
 List<Comparable<?>> result = new ArrayList<>(orderByItems.size());
 for (OrderItem each : orderByItems) {
 Object value = resultSet.getObject(each.getIndex());
 Preconditions.checkState(null == value || value instanceof Comparable, "Order by value must implements Comparable");
 result.add((Comparable<?>) value);
 }
 return result;
 }
 Object getObject(int var1) throws SQLException {
 Object var2 = null;
 if(this.rowSpaceIndicator == null) {
 DatabaseError.throwSqlException(21);
 }
 if(this.rowSpaceIndicator[this.indicatorIndex + var1] != -1) {
 if(this.externalType != 0) {
 switch(this.externalType) {
 case 93:
 return this.getTimestamp(var1);
 default:
 DatabaseError.throwSqlException(4);
 return null;
 }
 }
 if(this.statement.connection.j2ee13Compliant) {
 var2 = this.getTimestamp(var1);
 } else {
 var2 = this.getTIMESTAMP(var1);
 }
 }
 return var2;
 }

Proxoolの使用時にライブラリの結果が正しくない?

答えてください:

複数のデータ・ソースを構成するためにProxoolを使用するとき、各データ・ソースにエイリアスを設定すべきです。Proxoolは接続をフェッチするとき、接続プールが既存のエイリアスを含むかどうかを決定し、エイリアスを設定しないと、毎回1つのデータ・ソースから接続をフェッチすることになるからです。

 if(!ConnectionPoolManager.getInstance().isPoolExists(this.alias)) {
 this.registerPool();
 }

ShardingSphereが提供するデフォルトの分散自己インクリメント主キー・ポリシーが不連続で、そのほとんどが偶数テールであるのはなぜですか?

答えてください:

ShardingSphereは、デフォルトの分散自己インクリメント・プライマリ・キー・ポリシーとしてスノーフレーク・アルゴリズムを使用しています。このため、自己インクリメントの主キーはインクリメンタルであることが保証されますが、連続的ではありません。

対照的に、スノーフレークアルゴリズムの最後の4ビットは、同じミリ秒内のアクセスに対する増分値です。したがって、ミリ秒単位の同時実行性が高くない場合は、最後の4ビットがゼロになる可能性が高くなります。したがって、同時実行性が低いアプリケーションでは、主キーが生成される可能性が高くなります。

バージョン3.1.0で、偶数エンディングの問題が完全に修正されました

Windows環境でShardingSphereのソースコードをGit経由でクローンする場合、ファイル名が長すぎるのはなぜですか?

答えてください:

ソースコードの読みやすさを確保するため、ShardingSphereのコーディング仕様では、クラス、メソッド、変数に本来の名前を付ける必要があります。Windows版のGitはmsysを使用してコンパイルされているため、ファイル名を260文字以内に制限する古いバージョンのWindows APIを使用しています。

解決策は以下の通りです:

cmd.exeを開き、以下のコマンドを実行してgitを長いファイル名に対応させます:

git config --global core.longpaths true

Windows 10の場合、レジストリまたはグループポリシーを使って、オペレーティングシステムのファイル名の長さ制限を無効にする必要があります:

レジストリエディタで、HKLMSYSTEMACurentControllSetControlFileSystemLongPathsEnabledを作成し、REG_DWORDとタイプし、1に設定します。 または、システムメニューから設定アイコンをクリックし、「グループポリシーの編集」とタイプします。または、システムメニューから「設定」アイコンをクリックし、「グループポリシーの編集」と入力し、開いたウィンドウで「コンピュータの管理」→「管理用テンプレート」→「システム」→「ファイルシステム」と進みます。「ファイルシステム "の右側にある "win32ロングパスを有効にする "をダブルクリックします。

答えてください:

解凍ツールによっては、Sharding-Proxyのバイナリ・パッケージを解凍する際にファイル名が切り捨てられ、その結果、いくつかのクラスが見つからないことがあります。

解決策

cmd.exeを開き、以下のコマンドを実行します:

タイプが要求される例外に対する解決策は?

答えてください:

ShardingKeyGeneratorインターフェイスを実装し、Typeを設定したにもかかわらず、カスタム分散プライマリ・キーが機能しないのはなぜですか?

答えてください:

サービスプロバイダーインターフェイスは、APIの一種であるため、実装またはサードパーティによって拡張され、インターフェイスの実装に加えて、また、META-INF/servicesでSPIの実装クラスを指定する対応するファイルを作成する必要があります、JVMは、これらのサービスをロードします。

SPIの具体的な使い方については、ご自身で検索してみてください。

JPAとデータ減感作がうまくいきません。

答えてください:

データ減感用のDDLはまだ開発されていないため、データ減感とともにDDL文の自動生成にJPAを使用すると、JPAのエンティティクラスがDDLとDMLの両方を満たせない状況になる可能性があります。

解決策は以下の通りです:

  1. JPAのエンティティ・クラスに、感度を下げる必要のある論理カラムの名前を記述します。
  2. JPAのauto-ddlをオフにします(例:auto-ddl=none)。

サービス開始時のメタデータの読み込みを高速化するには?

答えてください:

  1. バージョン4.0.1以上にアップグレードすると、デフォルトdataSourceのテーブルメタデータの読み込み速度が向上します。
  2. 使用している接続プールを参照して、設定項目のmax.connections.size.per.queryを上げます。

インライン分割テーブル戦略で範囲クエリ操作を実行できるようにするには?

答えてください:

  1. バージョン4.1.0以上が必要です。
  2. この時点で、すべての範囲クエリはブロードキャストを使用して各サブテーブルをクエリすることに注意してください。

spring-boot-starterとsharding-jdbc-spring-boot-starterが特定のデータ接続プール用に構成されている場合、システムのスタートアップがエラーを報告するのはなぜですか?

答えてください:

  1. データ接続プール・スタータが最初にロードされ、既定のデータ・ソースが作成される可能性があるため、sharding-jdbc がデータ・ソースを作成するときに競合が発生します。
  2. 解決策は、データ接続プールのスターターを削除することで、sharing-jdbcがデータ接続プール自体を作成します。

答えてください:

  1. バージョン4.1.0では、ロジック・スキーマを動的に追加または削除する機能はサポートされていません。例えば、プロキシが2つのロジック・スキーマで開始された場合、プロキシは常にこれら2つのスキーマを保持し、これら2つのスキーマ内のテーブルとルールの変更イベントのみを感知することができます。
  2. バージョン4.1.0では、sharding-uiへの新しいロジックスキーマの追加、またはzookeeperへの直接追加がサポートされ、バージョン5.0.0ではロジックスキーマの削除がサポートされる予定です。

sharing-proxyを使用する場合、適切なツールを使用してプロキシに接続するにはどうすればよいですか?

答えてください:

  1. sharding-proxyはmysqlサーバと見なすことができるので、mysqlコマンドの接続と操作をサポートすることが望ましいです。
  2. 他のサードパーティ製データベースツールを使用する場合、異なるツールの特定の実装により例外が発生することがあります。例えば、IDEA/DataGripを使用する場合、Navicatバージョン11.1.13を使用し、JDBCメタデータを使用するintrospectオプションをオンにするなど、ツールの特定のバージョンを選択するか、特定のパラメータをオンにすることをお勧めします。
Read next

H5インライン開発互換性の問題

1.前髪画面 2.検索ボックス対応キーボードテキスト 3.戻るボタン

Sep 7, 2020 · 3 min read