1. 開発中のデータベース管理で発生した問題:
現在、開発はチームで行われるのが一般的であるため、プロジェクトの同期に問題が生じます。コードの同期は SVN ツールを使用して管理できますが、データベースの同期はどうなるのでしょうか?理想的には、新しいプロジェクトを開発するときは、最初にビジネスを明確にし、データベースのテーブルを設計し、その後メンテナンスのために専門の担当者にデータベースを引き渡すので、データベースの同期の問題は発生しません。しかし、実際の状況はどうなのでしょうか?要件はプロジェクトの最初から最後まで変化し続けます。多くの企業には専任のデータベース保守担当者がいません。全員がデータベースの操作と変更を行っています。チームがタイムリーにコミュニケーションをとり、全員が毎年コードを更新していれば問題ありません。データベース、コミュニケーションがタイムリーでない場合は、笑(自分で決めることができます)。 。 。このようにして、データベースが同期していない問題が浮き彫りになります。
2. Flyway の簡単な紹介:
1. コンセプト:
Flyway はデータベース アプリケーション、管理、およびデータベースの変更を追跡するための独立したデータベース バージョン管理ツール。平たく言えば、SVN がさまざまな人々のコードを管理するのと同じように、Flyway はさまざまな人々の SQL スクリプトを管理することができ、それによってデータベースの同期を実現します。
2. サポートされているデータベースの種類:
Oracle、SQL Server、SQL Azure、DB2、DB2 z/OS、MySQL (Amazon RDS を含む)、MariaDB、Google Cloud SQL、PostgreSQL (Amazon を含む) RDS および Heroku)、Redshift、Vertica、H2、Hsql、Derby、SQLite、SAP HANA、solidDB、Sybase ASE、および Phoenix。
3. SQL スクリプトの命名規則:
V バージョン番号 (バージョン番号の番号は「.」または「_」で区切られます) 二重アンダースコア (バージョン番号を区切るために使用されます)および説明) ファイル説明のサフィックス名 (例: V2017.9.30__Update.sql)。
注: バージョン番号を同じにすることはできません。
4. Flyway が SQL スクリプトを読み取るためのデフォルトの場所:
プロジェクトのソース フォルダーの下の db/migration ディレクトリ。
5. コマンド:
合計 6 つの基本コマンドがあります: 移行、クリーン、情報、検証、ベースライン、修復。
3. Flyway の利点:
1. SQL スクリプトをサポートするだけでなく、データベースを直接操作するための Java コードもサポートします (flyway -core-x.x.x.jar);
2. Maven プラグインあり;
3. コマンドラインをサポート;
4. Spring box と組み合わせると非常に便利データベース機能を自動的にチェックしてアップグレードします。
4. Flyway コマンド ライン ツールの使用:
1. flyway-commandlin バージョンを解凍してダウンロードし、ローカルで解凍します。
2. SQL スクリプトを Flyway のデフォルトの db/migration ディレクトリに配置します。別の場所に配置した場合は、conf 内の flyway.locations を変更する必要があります。 /flyway.conf ファイル。
3. 独自の状況に応じて、conf/flyway.conf ファイル内の flyway.url、flyway.user、flyway.password を変更します。
4. コマンドラインで移行コマンドを実行します。
5. Maven プロジェクトと組み合わせて使用する:
1. 依存関係座標を導入する:
<!-- flyway --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>4.2.0</version> <dependency>
2. src/main/resources に作成するディレクトリ SQL バージョン ファイルを保存するパスは dataBase/sqlite (デフォルトのパス db/migration を記述することもできます) で、その下に SQL ファイルを配置します。
3. flyway の Java クラスを追加します:
package com.xxxxxx.flyway; import javax.sql.DataSource; import org.flywaydb.core.Flyway; public class MigrationSqlite { private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void migrate() { //初始化flyway类 Flyway flyway = new Flyway(); //设置加载数据库的相关配置信息 flyway.setDataSource(dataSource); //设置存放flyway metadata数据的表名,默认"schema_version",可不写 flyway.setTable("SCHMA_VERSION"); //设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径,默认"db/migration",可不写 flyway.setLocations("dataBase/sqlite"); //设置sql脚本文件的编码,默认"UTF-8",可不写 flyway.setEncoding("UTF-8"); flyway.migrate(); } }
4. Spring のステップ 3 の Java クラスをインスタンス化します:
<bean id="MigrationSqlite" class="com.xxxxxx.flyway.MigrationSqlite" init-method="migrate"> <property name="dataSource" ref="dataSource"></property> </bean>
上記の Bean 定義から、flywayMigration Bean インスタンスにデータ ソースを挿入したことがわかります。Flyway のすべての操作はこのデータ ソースに対して実行されます。同時に、インスタンス化時に init-method 属性を通じて Spring を指定します。その後、Bean の移行メソッドがアクティブに実行され、このメソッド内で Flyway がデータベースを更新します。ここまでで、アプリケーションの起動時に Spring がコンテキストをインスタンス化し、Spring が flywayMigration Bean をインスタンス化すると、Flyway がデータベースを自動的に更新するところまで到達しました。
5. Flyway がデータベースを更新し、コード ロジックがデータベースを操作するときに競合を処理します (私はまだ遭遇していませんが、オンラインで見つけました。緊急用に保管しておきます):
Flyway がデータベースを更新する前に、アプリケーションの他のロジックが更新操作を完了する前に他の操作にデータベースを使用し始めます。これにより、アプリケーションに多くのバグが発生したり、まったく実行されなくなったりすることがあります。この問題を解決するには、Spring の Bean 依存関係原則を使用して、主要なデータベース操作 Bean を flywayMigration Bean に依存させ、flywayMigration がインスタンス化される (データベース更新操作が完了する) まで、他のデータベース関連の操作を実行できないようにします。
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="MigrationSqlite"> <property name="dataSource" ref="dataSource" /> </bean>
この方法では、プロジェクトが開始されるたびにデータベースが自動的に更新されるため、データベースが同期していないことを心配する必要はありません。
推奨チュートリアル: 「Java チュートリアル 」
以上がFlyway の詳しい使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。