私は基本的にJavaで書かれたゲームにMODに沸くものに永続バックエンドとしてのHibernate / JPAを使用しています。
この文脈では、私がメインスレッド上で可能な限りめったにとしてデータベースに照会していないことを私にとって非常に重要です。私はこれより頻繁に動作しませんではないよりも、他のスレッドからゲームオブジェクトのメソッドを呼び出す必要がありますように非同期でやって、可能ではあるが、実用的ではありません。この手段は、私が(速くデータベースからの結果を返すために、クエリを待つことよりもだろうメモリでの作業のように)のパフォーマンスを最大化するためにキャッシュされたオブジェクト私ができるように、使用してメモリ内にできるだけ多くのものとして行う必要があります。
セイ私は次のように定義されたエンティティを持っています:
@Entity
class Town {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@OneToMany(mappedBy = "town", fetch = FetchType.EAGER) // use eager fetching to save on having to query the database later for this
private Set<Resident> residents;
// ... other fields and associated getters/setters
}
@Entity
class Resident {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@ManyToOne(fetch = FetchType.EAGER) // use eager fetching to save on having to query the database later for this
@JoinColumn(name = "town_id")
private Town town;
// ... otehr fields and associated getters/setters
}
私の質問は以下の通りであります:
私は(たとえば、HashMapを使用して)休止状態を使用して、すべての居住者のエンティティを取得し、メモリに保存していた、と私はその後、同じように休止状態を使用して、すべての町のエンティティを取得するために進み、キャッシュにそれらをした場合、場合に呼び出しますTown#getResidents()
への戻りの参照をメモリ内の同じオブジェクトの一部は、として常駐キャッシュ内に存在していますか?
基本的に、以前に新しく作成されたコレクションを移入するクエリで返されたHibernateの再利用まだ有効なオブジェクトのでしょうか?
また、私はそれを改善できる方法についての私の一般的なアプローチやアドバイスのいずれかの批判に対してではないでしょう。前もって感謝します!:)
キャッシングは本当に複雑なトピックです。あなたは自分でキャッシングの世話をする必要はありません。冬眠何それの二次レベル・キャッシュがためです。
そのようなORM(オブジェクトリレーショナルマッピング)フレームワークなどのデータベース抽象化層の利点の一つは、基礎となるストアから取り出さ透過キャッシュデータに対してそれらの能力です。これは、 頻繁にアクセスされるデータのためのデータベース・アクセスのコストを排除するのに役立ちます。
あなたはまだキャッシュ可能とどのように積極的にキャッシュする必要があります休止状態であるためにあなたのエンティティを設定する必要がありますが、残りは休止状態によって処理されます
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Resident {
...