2012-05-02 10 views
0

私は、javaを介してインタフェースされる自動インクリメントの主キーを持つsqliteデータベースを持っています。 アプリケーションの理由から、自動生成された主キーをデータベースから使用することはできませんので、javaの各行にIDを作成する必要があります。JavaデータベースAutoIncrementプライマリキーアルゴリズム

私の質問は、そこにデータベースのためのユニークな整数のIDを作成するために従うことができるJavaのためのアルゴリズムがあるということです。

私はちょうど増分することができますが、私はロールバック、オーバーフロー、ギャップ充填のようなものを使用する必要があることを知っています。

+0

"アプリケーションの理由"については、私は正確に何を意味するのか分かりませんが、多分sqliteのsqlite3_int64 sqlite3_last_insert_rowidがあなたを助け、あなたのIDを生成するためにデータベースを使うことを可能にするかもしれません...ドキュメントを見てください:http://www.sqlite.org/ c3ref/last_insert_rowid.html –

+0

私たちのアプリケーションの設計上、データベースに書き込む前に私たちのレコードのidを知ることができる必要があります。sqlite3_last_insert_rowidは、sqliteがIDの作成を管理できるようにするなら、データベースで使用される自動インクリメントアルゴリズムの実装 – madlad

+0

ギャップ充填が本当に必要ですか?もしそうでなければ、最も単純なアプローチは、Oracleのシーケンスのような何か、すなわち、順次IDをアトミックに取得する方法を実装することであろう。アプリケーションの負荷が均衡していますか?もしそうなら、私はコードでそれをしません。 –

答えて

0

アプリケーションの要件に応じて、主キーの整数をStringに変更し、java utilクラスjava.util.UUIDを簡単に使用できます。不変のユニバーサルユニーク識別子(UUID)を表す。 UUIDは128ビットの値を表します。

アプリケーションが整数の主キーを持つ永続性を持つ場合。シーケンス番号を生成する関数を書くことができます。その背後にあるロジックは、基本的には現在のシーケンスが必要です。そうでなければ、dbを呼び出してmaxエントリを取得します。

static Integer currentSequence=-1; 
static Integer function primaryKeyGenerator(){ 
if(currentSequence==-1){ 
    //Make a db call and get the max 
    if(no data in table){ 
    currentSequence=1; 
    }else 
    currentSequence=rs.getInt(1); 
} 
return currentSequence+=1; 
} 
+2

あなたのアプリケーションがマルチスレッドの場合 –

+1

あなたは絶対にr8の場合、この関数を同期させる必要があります。しかし、その単なるスニペット。実装方法のアイデア。 –

+1

確かに - 「function」キーワードは、これが擬似コードであることを警告していたはずです –