2012-02-04 4 views
0

を新規作成しますが、私は4つのクラスを持っている私のproblem--株のインスタンスが、ここですべての新しいプロセスのため

です。

テストクラスは、スターターの新しいインスタンス(プロセス全体を読み込んで開始します)を作成します。 スターターはスケジューラークラスとデータベースクラスを初期化します。

テストクラスはスターターにデータを渡します。スターターはこれをデータベースクラスのHashMapに格納します。 スケジューラはと同じ HashMapをデータベースクラスから読み取ります。

は今、まったく同じHashMapのは、私のJavaプロジェクト全体のすべてのクラスからのアクセスであることを保証するために、私はHashMapの静的作ることや、データベースシングルトンクラス作るために2 options--を持っています。私はデータベースをシングルトンクラスにしました。

problem-- Testクラスこの

スターターstarterInstance1 =新しいスターター(ない場合)。

スターターstarterInstance2 =新しいスターター();

どのようにして、starterInstance1とstarterInstance2にデータベースクラスまたはHashMapの独自のインスタンスがあることを確認できますか?

==========

だけより明確である:

クラスTest {

スターターSTART1 =新しいスターター(); //自分のアプリケーションの1つのインスタンスを作成します

start1.init(); //これは、スケジューラなどを初期化して行います "getDatabaseInstanceを()"

ための式(I = 0 int型、I < 50; iが++){

start1.sendData( "abc"); //この50のリクエストはすべて、データベースプールのHashMapに格納されるリクエストを送信するスレッドプールに送信されます。 HashMapはスケジューラや他のクラスによって同時にアクセスされます。私はすべてのクラスがDBの同じインスタンスにアクセスするように、Databaseクラスのシングルトンを作成しました。

}

//同様に自分のアプリケーションの別のインスタンスを作成

スターターSTART2 =新しいスターター()。

start2.init(); //ここに「getDatabaseInstance()」を実行すると、私は上記と同じインスタンスを取得します。私はアプリケーションのこのインスタンスのための別のデータベースが欲しいです。どのように私はこれを達成するのですか? {

START2(; I < 50 I ++は、I = 0をINT)ため

。sendData( "abc");あなたの質問へ

}

}

+0

データベースがシングルトンである場合、私は彼らが別のインスタンスを持っている可能性がどのように表示されません。これがシングルトンパターンのポイントです。あなたの質問の一部は、すべてのクラスで同じ正確なマップにアクセスする必要があり、別のインスタンスはそれぞれのインスタンスが独自のインスタンスを持つ必要があると言います。なんでしょう? –

+0

はいシングルトンはインスタンスが1つしかないことを意味します。しかし、私はそれを望んでいない。私のアプリケーション全体の出発点はStarterクラスです。私のアプリケーションの新しいインスタンスが作成されるたびに(つまり、新しいStarter())、それはそれ自身のデータベースと同じデータベースにアクセスする独自のスケジューラーを持っていることを望みます。データベースをシングルトンクラスにすることは、ここではすべての新しいStarter()が同じデータベースを使用することを暗示するものではありません。すべての新しいStarter()に独自のデータベースを持たせたい – anzaan

答えて

1

最も一般的な答えはおそらく、単に独自のDatabaseへの参照のStarterキープトラックをできるようになります。もちろん、Schedulerは同じことを行う必要があります:

public class Starter { 
    Database db; 
    Starter(Database db) { 
     this.db = db; 
    } 
} 

/* ... */ 

Database db1 = new Database(); 
Starter starter1 = new Starter(db1); 
Scheduler scheduler1 = new Scheduler(db1); 

Database db2 = new Database(); 
Starter starter2 = new Starter(db2); 
Scheduler scheduler2 = new Scheduler(db2); 
+0

これは一つの方法です。私のアプリケーションは少し複雑です。私は、TCP接続を介してデータを転送するためにmina nioフレームワークを使用しています。私は、このデータベースのインスタンスがすべて私のアプリケーション上に必要になります。だから私はちょうどすべてのクラスにそれを渡し続けることはできません。さらに私はクライアント側でSessionHandlerで使用しています。そこのコンストラクタ引数としてDBインスタンスを渡すことはできません。 thnx fr urの提案btw! – anzaan

+0

すべてのStarterに独自のスレッドがある場合(その場合は、データベースをThreadLocalに格納することができます)、他の方法はありません。データベースインスタンスにアクセスする必要のあるクラスが非常に多い場合は、おそらく設計上の問題とカプセル化の欠如があります。 –

+0

私はあなたに同意します。私はこれが設計上の問題だと確信しています。しかし、私はすでに深く、完了の締め切り日に首をかけています! ThreadLocalについてだけ説明します。あなたはこれのためのデザインパターンを提案することができますか? – anzaan

関連する問題