@Service("accessLogService")
@Transactional
public class LogMessageServiceImpl extends BaseDaoServiceImpl<AccessLogMessage,Long> implements LogMessageService{
 @Autowired
 SplitHibernateInterceptor splitInter;
 @Autowired
 public BaseDaoImpl<AccessLogMessage> baseDao;
 /**
  * 根据当前月份
  */
 @Override
 public void addLog(AccessLogMessage message) {
  //要拦截的目标数据库名称
  splitInter.setTargetTableName("accesslog_message");
  //月份从0计算
  int month = Calendar.getInstance().get(Calendar.MONTH);
  if(month==0){
   //1月份
   baseDao.save(message);
  }else{
   splitInter.setSubTableName("accesslog_message"+month);
   SessionFactory sf= baseDao.getSessionFactory();
   Session session = sf.openSession(splitInter);
   try{
    session.save(message);
   }finally{
    session.close();
   }
  }
  
 }
}

@Service("splitInter")
public class SplitHibernateInterceptor extends EmptyInterceptor {
 private static final long serialVersionUID = 2293562313992510554L;

private String targetTableName;// 目标母表名
 private String subTableName;// 操作子表名 ,与目标结构一样

public SplitHibernateInterceptor() {
 }

public java.lang.String onPrepareStatement(java.lang.String sql) {
  sql = sql.toLowerCase();
  sql = sql.replaceAll(targetTableName, subTableName);
  return sql;

}

public String getTargetTableName() {
  return targetTableName;
 }

public void setTargetTableName(String targetTableName) {
  this.targetTableName = targetTableName;
 }

public String getSubTableName() {
  return subTableName;
 }

public void setSubTableName(String subTableName) {
  this.subTableName = subTableName;
 }

}

@Component("baseDaoService")
@Transactional
public class BaseDaoServiceImpl<T, K extends Serializable> implements
  BaseDaoService<T, K> {

@Autowired
 public ExtendBaseDao<T, K> extendBaseDao;

@Override
 public void add(T t) {
  extendBaseDao.save(t);
 }

@Override
 public void delete(T t) {
  extendBaseDao.delete(t);
 }

@Override
 public void update(T t) {
  extendBaseDao.update(t);
 }

@Override
 public T get(Class<T> entityClass, K k) {
  return extendBaseDao.get(entityClass, k);
 }

@Override
 public void deleteByHql(String hql ,Object... objects) {
  extendBaseDao.delete(hql, objects);
 }

@Override
 public List<T> query(String hql, Object... objects) {
  return extendBaseDao.list(hql, objects);
 }

@Override
 public void marge(T t) {
  extendBaseDao.merge(t);
 }

}

@Entity
@Table(name = "ACCESSLOG_MESSAGE")
public class AccessLogMessage {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "id")
 private Long id;
 @Column(name = "requestURI", length = 250)
 private String requestURI;
 
 @Column(name = "requestTime", length = 30)
 private String requestTime;
 @Column(name = "requestParams", length = 1000)
 private String requestParams;
 @Column(name = "userName", length = 32)
 private String userName;

@SuppressWarnings("serial")
public class ViewJsonInterceptor implements Interceptor {
 @Autowired
 private MemcachedClient memcachedClient;
 private static final Logger logger = LoggerFactory
   .getLogger(ViewJsonInterceptor.class);

@Override
 public void init() {
  logger.info("Json格式化拦截器启动!");
 }

@Override
 public void destroy() {
  logger.info("Json格式化拦截器销毁!");
 }

public HttpServletRequest getRequest(ActionInvocation invocation) {
  ActionContext context = invocation.getInvocationContext();
  HttpServletRequest request = (HttpServletRequest) context
    .get(StrutsStatics.HTTP_REQUEST);
  return request;
 }

public HttpServletResponse getResponse(ActionInvocation invocation) {
  ActionContext context = invocation.getInvocationContext();
  HttpServletResponse response = (HttpServletResponse) context
    .get(StrutsStatics.HTTP_RESPONSE);
  return response;
 }

@Override
 public String intercept(ActionInvocation invocation) throws Exception {

HttpServletRequest request = getRequest(invocation);
  HttpServletResponse response = getResponse(invocation);
  response.setContentType("text/html;charset=UTF-8");
  // end
  Object action = invocation.getAction();
  String methodName = invocation.getProxy().getMethod();
  Method method = action.getClass().getDeclaredMethod(methodName, new Class[0]);
  
  //防止 重复参数,如果重复取第一个
  invocation.getInvocationContext().setParameters(InterceptorUtil.noRepeatParams(invocation));
  
  
  if (!(action instanceof BaseViewJsonAction)
    || !method.isAnnotationPresent(ViewJson.class)) {
   return invocation.invoke();
  }
  String voke = null;
  BaseViewJsonAction baseViewJsonAction = (BaseViewJsonAction) action;// ============检验当前访问在缓存中是否存在========================
  String memcachedSwitch = Switch.getInstance().getMemcachedSwitch();
  String cacheKey = "";
  if (Switch.OPEN.equals(memcachedSwitch) && method.isAnnotationPresent(MemCachedJson.class) ) {
   // 获取当前访问URL对应的缓存key
   cacheKey = InterceptorUtil.getCacheKey(invocation, request);
   logger.debug("[key=]" + cacheKey);
   String cacheValue = null;
   try {
    memcachedClient.setSanitizeKeys(true);
    cacheValue = memcachedClient.get(cacheKey);
    if (StringUtils.isNotBlank(cacheValue)) {
     // 缓存中已存在cacheKey的cacheValue,则直接返回
     //记录日志,并保存至数据库
     InterceptorUtil.log(request, invocation);
     response.getWriter().write(cacheValue);
     return null;
    }
   } catch (Exception e) {
    logger.error("memecached异常:", e.getMessage());
   }
  }

try {
   invocation.invoke();
   JsonViewMessage jsonMessage = baseViewJsonAction.getJsonViewMessage();
   String code = "" + jsonMessage.getRet();
   if (Switch.OPEN.equals(memcachedSwitch) && method.isAnnotationPresent(MemCachedJson.class)) {
    // 将返回的正确结果注入缓冲
    
    code = "" + jsonMessage.getRet();
    if ("0".equals(code)) {
     String returnValue = baseViewJsonAction.jsonViewAsString();
     try {
      memcachedClient.set(cacheKey, 0, returnValue);
     } catch (Exception e) {
      logger.error("memecached set 缓存异常:", e.getMessage());
     }
     
    }
    // 注入缓存完成
   }
   if ("0".equals(code)) {
    //记录日志,并保存至数据库
    InterceptorUtil.log(request, invocation);
   }else{
    if(!"1".equals(code)&&logger.isErrorEnabled()){
     logger.error("code:" + code + ";message:" + jsonMessage.getRetInfo());
     logger.error("调用"+invocation.getAction().getClass().getSimpleName()+"."+methodName+"()");
     String absUrl =ServletRequestUtil.getRequestURL(request);
     logger.error(IPRequest.getIpAddress(request)+"=>"+request.getMethod()+"请求地址:"+absUrl);
    }
   }

} catch (BusinessException e) {
   if(!"0".equals(e.getCode())){
    if(logger.isErrorEnabled()){
     logger.error("code:" + e.getCode() + ";message:" + e.getMessage());
     logger.error("调用"+invocation.getAction().getClass().getSimpleName()+"."+methodName+"()");
     String absUrl =ServletRequestUtil.getRequestURL(request);
     logger.error(IPRequest.getIpAddress(request)+"=>"+request.getMethod()+"请求地址:"+absUrl);
    }
   }
   baseViewJsonAction.getJsonViewMessage().setResult(null);
   baseViewJsonAction.getJsonViewMessage().setRet(e.getCode());
   baseViewJsonAction.getJsonViewMessage().setRetInfo(e.getMessage());
   
   
   
  }  finally {
   baseViewJsonAction.writeJsonView();
  }
  return voke;

}

public void writeJsonView() {
  if (userDefinedJsonObject != null) {
   userDefinedJsonObject.put("ret", jsonViewMessage.getRet());
   userDefinedJsonObject.put("retInfo", jsonViewMessage.getRetInfo());
   JsonFormater.writeJsonValue(mapper, this.response,
     userDefinedJsonObject);
   return;
  }
  if (jsonViewMessage.getAlias() != null) {
   Map<String, Object> map = new HashMap<String, Object>(3);
   map.put("ret", jsonViewMessage.getRet());
   map.put("retInfo", jsonViewMessage.getRetInfo());
   map.put(jsonViewMessage.getAlias(), jsonViewMessage.getResult());
   JsonFormater.writeJsonValue(mapper, this.response, map);
   return;
  }
  JsonFormater.writeJsonValue(mapper, this.response, jsonViewMessage);
 }

<package name="BasePackage" extends="struts-default">
  <interceptors>
   <interceptor name="LogInterceptor" class="com.core.action.interceptor.LogInterceptor"/>
   <interceptor name="ViewJsonInterceptor" class="com.core.action.interceptor.ViewJsonInterceptor"/>
   <!--<interceptor name="ParamValidateInterceptor" class="com.core.interceptor.ParamValidateInterceptor"/>-->
   <interceptor-stack name="JsonInterceptorStack">
    <interceptor-ref name="LogInterceptor"/>
    <interceptor-ref name="ViewJsonInterceptor"/>
    <!--<interceptor-ref name="ParamValidateInterceptor"/>-->
    
    <interceptor-ref name="defaultStack"/>
   </interceptor-stack>
  </interceptors>
  <default-interceptor-ref name="JsonInterceptorStack"/>
  <default-action-ref name="notFound" />
      <action name="notFound">
       <result>/WEB-INF/404.jsp</result>
     </action>
 </package>

hibernate分表保存日志的更多相关文章

  1. 使用hibernate 分表做增删改查

    公司项目有一张表的数据量特别大.而且时间越长累积的数据量就越大. 后来DBA决定分表来解决性能问题. 分表是指   一个母体表  一群子表(结构和字段与母体表完全一样) 我们程序对母表操作其实就是对子 ...

  2. Log4j分级别保存日志到单个文件中,并记录IP和用户信息

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration S ...

  3. 利用Sharding-Jdbc实现分表

    你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订单跟雪花一样纷沓而来. 慢慢地,你的心情开始变差,因为客户和产品的抱怨越来越频繁,抱怨的最多的一个问题就 ...

  4. 利用Sharding-Jdbc实现分表[z]

    [z]https://www.cnblogs.com/codestory/p/5591651.html 你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订 ...

  5. Mysql数据库常用分库和分表方式

    http://blog.csdn.net/clevercode/article/details/50877580 1 分库 1.1 按照功能分库 按照功能进行分库.常见的分成6大库:    1 用户类 ...

  6. mysql分库分表(一)

    mysql分库分表 参考: https://blog.csdn.net/xlgen157387/article/details/53976153 https://blog.csdn.net/cleve ...

  7. PostgreSQL 务实应用(三/5)分表复制

    问题的提出 在项目中,有些表的记录增长非常快,记录数过大时会使得查询变得困难,导致整个数据库处理性能下降.此时,我们会考虑按一定的规则进行分表存储. 常用的分表方式是按时间周期,如每月一张,每天一张等 ...

  8. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

  9. Hibernate与数据库分表

    数据库分片(shard)是一种在数据库的某些表变得特别大的时候采用的一种技术. 通过按照一定的维度将表切分,可以使该表在常用的检索中保持较高的效率,而那些不常用的记录则保存在低访问表中.比如:销售记录 ...

随机推荐

  1. jsp中的setHeader页面跳转备忘录

    1 <!-- response.setHeader("refresh","3;url=你想跳的页面")--> <%-- response.se ...

  2. 绑定树tree 的后台方法

    #region 获取部门列表树集合         /// <summary>         /// 获取部门列表树集合         /// </summary>     ...

  3. IOS上微信在输入框弹出键盘后,页面不恢复,下方有留白,有弹窗弹出时页面内容感应区域错位

    问题说明: ios中,键盘的弹起,页面会往上挪动,使输入框展示在页面中间,键盘隐藏页面会下挪恢复原状. 在微信移动端,ios页面不恢复,下方有留白. 收起键盘的瞬间,如果有弹窗弹出,此时时页面内容应区 ...

  4. 357 Count Numbers with Unique Digits 计算各个位数不同的数字个数

    给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n.示例:给定 n = 2,返回 91.(答案应该是除[11,22,33,44,55,66,77,88,99 ...

  5. C与C艹的内存管理方式

    C 内存开辟出的空间一般可以分成:代码段,数据段(初始化的数据段, 为初始化的数据段BSS),堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量 ...

  6. wampserver修改mysql数据库密码的简单方式

    刚装好的wampserver的数据库是没有密码的,所以可以直接登录,要设置密码,一种简单的方式如下: 打开phpMyadmin 初始状态没有密码,可以直接登录 登录之后,点击账户 点击修改权限,设置你 ...

  7. win32窗口映射(部分)

    先理解一下“窗口”与“视区”的概念.“窗口”是逻辑坐标下的矩形区域,“视区”是设备坐标系下的区域.根据“窗口”和“视区”的大小可以确定x方向和y方向的比例因子. 例子如下: VOID OnPaint( ...

  8. 01--Java开发中文乱码问题分析

    一.常见的编码格式 1. ASCII码 总共128个字符,用1个字节的低7位表示,0~31是控制字符,32~126是打印字符. 2.  ISO-8859-1 ISO组织在ASCII基础上进行扩展,仍是 ...

  9. servlet-响应信息的content-Type作用

    package servlet; import java.io.File; import java.io.FileInputStream; import java.io.IOException; im ...

  10. python发送文本邮件

    #!/usr/bin/env python #coding=utf-8 #Author: Ca0Gu0 import time import smtplib from email.mime.text ...