2011-02-25 1 views
0

J'ai une table contenant une série de chaînes uniques dont j'ai besoin pour fournir des recherches rapides (en plus de la mémoire cache).Hibernate façon rapide de rechercher chaîne unique dans la table

@Entity 
public class UniqueString { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Basic 
    @NaturalId 
    private String stringId; 
} 

Au départ, j'avais la variable stringId comme @Id, mais il est apparu que certaines bases de données (par exemple, Oracle) sont entrés dans full table scan lors de la récupération par l'objet string id; donc je suis passé à un long à la place.

Comment puis-je accéder rapidement à l'objet UniqueString à partir d'une chaîne stringId. Je vois deux solutions à ce jour:

  • Encore une fois, annoter stringId avec @id et essayer de trouver une solution pour pourquoi full table scans se produisent dans certaines bases de données
  • Hash la chaîne dans un long (tout en perdant la précision) et utiliser une recherche table pour renvoyer tous les objets correspondant au hachage, puis comparez leur propriété stringId pour l'égalité afin de trouver la correspondance recherchée, par exemple:

.

LookupTable     UniqueString 
+----+------+    +----+----+----------+ 
|hid | hash |    | id |hid | stringId | 
+----+------+    +----+----+----------+ 
| 1 | 123 | -------------> | .. | 1 | .... | 
| 2 | 321 |  `-----> | .. | 1 | .... | 
+----+------+    +----+----+----------+ 

Opinions, suggestions?

[EDIT] Ok je me rends compte que mon illustration tableau ci-dessus pourrait simplement être normalisée à

UniqueString 
+----+-----+----------+ 
| id |hash | stringId | 
+----+-----+----------+ 
| .. | 123 | .... | 
| .. | 123 | .... | 
| .. | 321 | .... | 
+----+-----+----------+ 

Cela fait toute la différence que je soupçonne que les deux requêtes suivantes exécuterait à peu près le même:

  • from UniqueString where hash='123'
  • from UniqueString where stringId='abc'

Répondre

4
  1. vous assurer qu'il ya un index sur la Colum stringID dans la base de données

  2. vient interroger la base de données en utilisant hql ou critères API

  3. configure le cache de votre requête pour mettre en cache cette requête de type.

1

Il s'agit plus de la façon dont vous conservez la colonne dans la base de données. Je pense que la bonne façon est de définir un index de hachage sur la colonne et marquer le champ dans l'entité comme index.

Questions connexes