1

1つのDBを攻撃するために使用されるWebサービスウィッチを実装しています。保存するオブジェクトのIDを生成する必要がありますが、それを行うための最良の方法がわかりません。INTをインクリメントする必要があります。

明らかに、Webサービスは非常に多くの人々に使用され、同時にさまざまなものに使用される必要があります。

だから、良い解決策は何ですか?

シングルトン/同期??

私が知っている唯一の方法だと思います、多分もっと良い他のものがあるでしょう。

あなたが私に一例を示すことができれば、それは非常にありがたいです。

前もって感謝します!

4

3 に答える 3

0

これを実現するには、同期ブロックを使用します。同期ブロックでは、1つのスレッドのみがその中に入ることができます。

JVMは、Java同期コードが一度に1つのスレッドによってのみ実行されることを保証します。

于 2013-03-19T17:49:58.630 に答える
0

Synchronizeにはひどいオーバーヘッドがあります。必要なのがインクリメンタルカウンターだけの場合は、 AtomicLongのincrementAndGet()を使用できます。AtomicLongをシングルトンに入れて、サーバー全体にアクセスできるようにします。

編集:いくつかのコード例:

import java.util.concurrent.atomic.AtomicLong;

public class AtomicIdGenerator
{
    private static class SingletonHolder
    {
        public static final AtomicIdGenerator instance = new AtomicIdGenerator();
    }

    public static AtomicIdGenerator getInstance()
    {
        return SingletonHolder.instance;
    }

    private AtomicLong mIdGenerator = null;

    private AtomicIdGenerator()
    {
        mIdGenerator = new AtomicLong();
    }

    private AtomicLong getGenerator()
    {
        return mIdGenerator;
    }

    public long getNewId()
    {
        return getGenerator().incrementAndGet();
    }
}

使用例は次のとおりです。

long tNewId = AtomicIdGenerator.getInstance().getNewId();

これはスレッドセーフであり、同期によるオーバーヘッドはありません。将来、多くの同時ユースケースを処理することを予測している場合、java.util.concurrentパッケージは、ユースケースに対して多くの実証済みの実装を提供します。

于 2013-03-19T18:01:29.060 に答える
0

あなたはこのようなことをすることができます。私はしばらく前にそれをしました、それはPostgreSqlとiBatisに基づいていました、しかしあなたは考えを得ることができます。

public class Sequence implements Serializable {
    private static final long serialVersionUID = 7526471155622776147L;
    private String name  = null;
    private int nextId = 0;

    public Sequence () {
    }

    public Sequence (String name, int nextId) {
        this.name = name;
        this.nextId = nextId;
    }

    public final String getName () {
        return name;
    }

    public final void setName (String name) {
        this.name = name;
    }

    public final int getNextId () {
        return nextId;
    }

    public final void setNextId (int nextId) {
        this.nextId = nextId;
    }

}


public class SequenceSqlMapDao extends SqlMapClientDaoSupport implements SequenceDao {

  /**
   * This is a generic sequence ID generator that is based on a database
   * table called 'SEQUENCE', which contains two columns (NAME, NEXTID).
   * <p/>
   * This approach should work with any database.
   *
   * @param name The name of the sequence.
   * @return The Next ID
   * @
   */
  public final synchronized int getNextId(String name) {
    Sequence sequence = new Sequence(name, -1);
    //Sequence sequence = new Sequence();
    sequence = (Sequence) getSqlMapClientTemplate ().queryForObject("getSequence", sequence);
    if (sequence == null) {
            try {
                throw new IllegalArgumentException("Error: SHOOT! A null sequence was returned from the database (could not get next " + name + " sequence).");
            } catch (Exception ex) {
                Logger.getLogger(SequenceSqlMapDao.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    Object parameterObject = new Sequence(name, sequence.getNextId() + 1);
    getSqlMapClientTemplate ().update("updateSequence", parameterObject);
    int nextId = sequence.getNextId();

    parameterObject  = null;
    sequence = null;

    return nextId;
  }

}

他に何もないとしても、これはかなりデータベースに依存しません。それでも、Webサービスでメソッドを公開する必要があります。PS-私はこれをどこから入手したかを忘れました。さもなければ、適切な情報源にクレジットを与えるでしょう。

于 2013-03-19T18:04:54.587 に答える