2013-10-07 3 views
0

Base de données: mysql - la structure de la table est.mise en œuvre du résultat de recherche du cache

------------------------------------------ 
phone_no (This is PK) | month | year 
------------------------------------------ 
varchar(15)    | INT (2) | INT(4) 

Cela a milions d'enregistrements, maintenant, quand un utilisateur l'accès au site pour la première fois en un mois, alors je dois faire une entrée dans le DB, rien otherise se produira, c'est pour signaler but. mon code Java est:

The VO ----> 
     public class UesrAccessInfo { 
      private String phone_no; 
      private int year; 
      private int month; 
      .. getters and setters ... 
     } 

Maintenant, le code Java pour accéder à la table est:

/* méthodes suivantes sont mises en œuvre dans le code java, pas db accès sont là */

String phone_no = getPhoneNumber(); 
int currentMonth = getCurMonth(); 
int currentYear = getCurYear(; 

if (phone_no == null) { 
    request.setAttribute("firstAccessInCurrentMonth", false); 
} 
else{ 
    UesrAccessInfo oUesrAccessInfo = new UesrAccessInfo(); 
    oUesrAccessInfo.setPhone_no(phone_no); 
    UserAcessHistoryDBUtil.getUesrAccessInfo(oUesrAccessInfo); 

    //////////// Code for getUesrAccessInfo() in UserAcessHistoryDBUtil class ///////////// 
     String sql = "select month , year from user_access_history where phone_no= ?"; 
     String[][] rs = new MyDBAccessor().getPreparedTable(sql,new String[] { oUesrAccessInfo.getMsisdn() }); 
     if (rs != null && rs.length > 0) { 
     for (String[] item : rs) { 
      oUesrAccessInfo.setMonth(Integer.parseInt(item[0])); 
      oUesrAccessInfo.setMonth(Integer.parseInt(item[1])); 
     } 
     }else{ 
     oUesrAccessInfo.setMonth(0); 
     } 
    } 
    ///////////////////////////////////////////////////////////////// 
    /** 
    * User is already present in database 
    */ 
    if(oUesrAccessInfo.getMonth() != 0){ 

     /** 
     * User has already accessed the site in current month 
     */ 
     if(oUesrAccessInfo.getYear() == currentYear && oUesrAccessInfo.getMonth() == currentMonth){ 
      request.setAttribute("firstAccessInCurrentMonth", false); 
     } 
     else{ 
      UserAcessHistoryDBUtil.updateUserAccessHistory(phone_no, ""+ currentMonth, "" + currentYear); 
      request.setAttribute("firstAccessInCurrentMonth", true); 
     } 
    } 
    /** 
    * User is not present in database 
    */ 
    else{ 
     UserAcessHistoryDBUtil.createUserAccessHistory(phone_no,""+ currentMonth, "" + currentYear); 
     request.setAttribute("firstAccessInCurrentMonth", true); 
    } 
} 

Donc, ici, je suis confronté à la question de la performance. Je ne peux pas utiliser la mise en cache, car il peut y avoir une erreur de mémoire insuffisante dans le serveur.

Toute suggestion, pour améliorer les performances, je suis nouveau dans mysql.

Répondre

0

Mes suggestions

  • Depuis cela, il suffit de signaler le but et ne va pas affecter l'utilisateur, pourquoi ne pas vous run it in a separate thread?
  • Vous pouvez insérer une insertion pour chaque accès dans TableA et créer un traitement par lots qui effectue une insertion en bloc dans la table dans laquelle vous insérez actuellement. Au moins, cela éviterait d'exécuter la requête select.
+0

Merci pour votre suggestion, mais enfin je suis implementating ehcache pour cette :) –

+0

mais vous avez dit que vous ne pouvez pas utiliser la mise en cache .. –

+0

Désolé pour cela, en fait ce moment-là ma préoccupation est le cache utilisera de la mémoire jvm et donc peut tomber en panne, mais j'ai trouvé que par ehcache je peux également utiliser la mémoire externe. Désolé pour mon unknowing au sujet de la mise en cache. La mise en œuvre finale sera les données seront récupérées, mises à jour et insérées dans le cache et lorsqu'une certaine limite est franchie, un travail dorsal mettra à jour la base de données. :) –