0

数据库:mysql——表结构是。

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

这有数百万条记录,现在当用户在一个月内第一次访问该网站时,我必须在数据库中输入一个条目,否则什么都不会发生,这是为了报告目的。我的 Java 代码是:

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

现在访问表的ja​​va代码是:

/* 以下方法在 java 代码中实现,没有 db 访问 */

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 的新手。

4

1 回答 1

0

我的建议

  • 由于这只是为了报告目的而不会影响用户,为什么不在单独的线程中运行它呢?
  • 您可以为对某些 TableA 的每次访问执行插入操作,并创建一个批处理过程,该过程将对您当前插入的表进行批量插入。至少这样可以避免运行选择查询。
于 2013-10-07T12:19:49.637 回答