0

Java から MySQL にスキーマを作成する必要があるライブラリがあります。現在、mysqlコマンドにパイプするだけのスキーマのダンプがあります。これは問題なく動作しますが、次の理由から理想的ではありません。

  • 脆弱です:mysqlコマンドはパス上にある必要があります: 通常、OSX または Windows では、追加の構成なしでは機能しません。
  • また、スキーマが記述的ではなくステートメントとして格納されるため、脆い
  • Java はすでに mysql データベースにアクセスできるため、これを行うために外部プログラムに依存するのはばかげているように思えます。

これを行うためのより良い方法を知っている人はいますか? 多分...

  • ファイルからステートメントを読み取り、Java から直接実行できますか? セミコロンの解析と手動でのステートメントの分割を伴わない方法はありますか?
  • スキーマを他の方法で保存できます-構成ファイルとして、またはJavaで直接、ステートメントとしてではなく(レールのスタイルdb:schemaまたはのスタイルでdatabase.yml)、この説明からスキーマを作成するライブラリがありますか?

以下は、動作する既存のコードのスニペットです (mysqlコマンド ライン上にある場合)。

if( db == null ) throw new Exception ("Need database name!");
String userStr = user == null ? "" : String.format("-u %s ", user);
String hostStr = host == null ? "" : String.format("-h %s ", host);
String pwStr = pw == null ? "" : String.format("-p%s ", pw);

String cmd = String.format("mysql %s %s %s %s", hostStr, userStr, pwStr, db);

System.out.println(cmd + " < schema.sql");      

final Process pr = Runtime.getRuntime().exec(cmd);

new Thread() {
    public void run() {              
        try (OutputStream stdin = pr.getOutputStream()) {
            Files.copy(f, stdin);
        } 
        catch (IOException e) { e.printStackTrace(); }                          
    }
}.start();

new Thread() {
    public void run() {             
        try (InputStream stdout = pr.getInputStream() ) {
            ByteStreams.copy(stdout, System.out);
        } 
        catch (IOException e) { e.printStackTrace(); }
    }
}.start();              

int exitVal = pr.waitFor();
if( exitVal == 0 )
    System.out.println("Create db succeeded!");
else    
    System.out.println("Exited with error code " + exitVal);
4

2 に答える 2

1

短い答え(私が知る限り)はノーです。ファイルを個別のステートメントに解析する必要があります。

私は同じ状況に直面しており、このトピックに関する多くの質問をここSOで見つけることができます。ここのようなものはパーサーを表示します。 他の人は、スキーマをxml形式に変換し、それを読み戻すことができるapacheからこの投稿のようなツールに転送できます。

この答えを書くときの私の主な意図は、最後にコマンドラインを使用することを選択したことを伝えることです。

  • 追加の構成:追加の作業である可能性がありますが、構成によって、または内部で実行しているシステムに基づいて実行時に行うことができます。あなたは一度努力をし、あなたは終わりです
  • 外部ツールによって異なります:見た目ほど悪くはありません。あなたにもいくつかの利点があります。

    1-スキーマコマンドを解析するためだけに、追加のコードを記述したり、追加のライブラリを導入したりする必要はありません。

    2-ツールはベンダーによって提供されます。おそらく、解析を行う他のどのコードよりもデバッグとテストが進んでいます。

    3-長期的にはより安全です。パーサーを「壊す可能性がある」ダンプの形式の追加または変更は、データベースリリースに付属のツールでサポートされる可能性があります。コードを変更する必要はありません。

    4-ツールを使用する(スキーマを作成する)アクションの性質は、頻繁な使用を示唆しておらず、パフォーマンスのボトルネックになるリスクを最小限に抑えます。

私はあなたがあなたのニーズに最適な解決策を見つけることができることを願っています。

于 2013-03-21T15:24:24.680 に答える
0

Yankを確認してください。より具体的には、そのページにリンクされているコード例を確認してください。これは、DBUtils の上に構築された軽量の永続化レイヤーであり、接続と結果セットの処理に関するすべての核心を隠しています。あなたが言及したように、設定ファイルを簡単にロードすることもできます。また、プロパティ ファイルから SQL ステートメントを保存およびロードしたり、SQL ステートメントをコードにハードコーディングしたりすることもできます。

于 2013-03-18T17:38:34.320 に答える