關於日志表的自動創建及分表儲存


雖然項目經歷覺得這樣做不妥,但還是覺得有必要記錄一下。

主要思路就是:

數據表名格式在自己規定好的,如:sys_log_2018,2018是獲取當前年份;

添加數據時會判斷數據庫是否存在這張表,如果存在,則會添加數據,如果不存在,則會根據年份重新創建一個新的物理表;

創建表的代碼如下

/**
    * 創建表
    * @param tableName
    */
   public void createTmpTable(@Param(value="tableName")String tableName);

創建表的sql如下:

<update id="createTmpTable" parameterType="string">
        CREATE TABLE ${tableName}(         
        id VARCHAR2(64) not null,
        log_type VARCHAR2(64),  
        title NVARCHAR2(500),  
        create_by VARCHAR2(64),  
        create_date TIMESTAMP(6),  
        remote_addr VARCHAR2(255),  
        user_agent VARCHAR2(255),  
        request_uri VARCHAR2(255),  
        method VARCHAR2(5),  
        params CLOB,  
        exception CLOB,
        operate_type VARCHAR2(64),  
        content CLOB,
         PRIMARY KEY (id)     
        )
 </update>

查詢表名:

public List<String> findAllTableNames();
<
select id="findAllTableNames" resultType="String"> <![CDATA[ select table_name from user_tables ]]> </select>
public static void saveLog(HttpServletRequest request, Log log){
   LogService logService = (LogService) ContextLoader.getCurrentWebApplicationContext()
            .getBean("logService");
//查詢所有表名 List
<String> list = logService.findAllTableNames(); String tableName = "sys_log_" + DateUtils.getYear(); if (!list.contains(tableName.toUpperCase())) { logService.createTmpTable(tableName); } User user = UserUtils.getUser(); if (user != null && user.getId() != null){ log.setCreateBy(user); log.setRemoteAddr(com.thinkgem.jeesite.common.utils.StringUtils.getRemoteAddr(request)); log.setUserAgent(request.getHeader("user-agent")); log.setRequestUri(request.getRequestURI()); log.setParams(request.getParameterMap()); log.setMethod(request.getMethod()); log.setCreateDate(user.getLoginDate()); log.preInsert(); log.setTableName(tableName); logDao.insert(log); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM