2013-10-07 4 views
0

База данных: mysql - структура таблицы.реализация результата поиска кэш-памяти

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

Это Milions записей, теперь, когда доступ пользователей сайта в первый раз в месяц, то я должен сделать запись в БД, otherise ничего не произойдет, это для отчетности цели. мой Java-код:

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

Теперь код Java для доступа к таблице является:

/* Следующие методы реализованы в Java коде, нет дБ доступы не существует */

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); 
    } 
} 

Итак, здесь я столкнулся с проблемой производительности. Я не могу использовать кеширование, так как на сервере может быть ошибка памяти.

Любое предложение, чтобы улучшить производительность, я новичок в mysql.

ответ

0

Мои предложения

  • Поскольку это сделано только для отчетности цели и не собирается повлиять на пользователя, почему вы не run it in a separate thread?
  • Вы можете сделать вставку для каждого доступа в некоторый TableA и создать пакетный процесс, который будет делать объемную вставку в таблицу, в которую вы сейчас вставляете. По крайней мере, это позволит избежать выполнения запроса select.
+0

Спасибо за ваше предложение, но в конце концов я EHCache для дела внедрения этого :) –

+0

, но вы сказали, что вы не можете использовать кэширование .. –

+0

Извините за что, на самом деле это время моего беспокойства кэша будет использовать Jvm память и, таким образом, может сбой, но я обнаружил, что по ehcache я также могу использовать внешнюю память. Извините за мое незнание о кешировании. Окончательная реализация будет получать, обновлять и вставлять данные в кеш, а при переходе определенного предела, backend-задание будет обновлять базу данных. :) –

Смежные вопросы