`
huiseyiyu
  • 浏览: 101437 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

数据库能力放通(记录)

 
阅读更多

   要求数据库中断的情况下,部分功能能力放通:

   实现思路:本想用csv文件存储临时数据,发现用数组拼装太麻烦,后直接采用对象序列化存储

   采用读写所操作数据,在业务操作时,捕捉数据库中断异常,把对象写入缓存文件中,

   数据库正常后,任意一个用户登陆,开辟一个线程进行读操作,写入数据库,然后删除缓存文件

 

   过程中发现学序列化追加存储,无法正常读取,最后一个工具类是处理该问题的

 

 

/**
 * 
 * 缓存文件读取
 * <读取缓存文件,对缓存数据进行数据库持久化操作>
 * 
 * @author  xxx
 * @version  [V01, 2011-9-6]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
@Scope("prototype")
@Component
public class ReadTask extends Thread
{
    private Log log = LogFactory.getLog(ReadTask.class);
    
    /**
     * 文件读写操作类
     */
    @Autowired
    private ReadWriteLockLogic readWriteLockOperator;
    
    @Autowired()
    private EventRepository eventRepository;
    
    /**
     * 执行读取任务
     */
    public synchronized void run()
    {
        
        if (this.readWriteLockOperator != null)
        {
            
            //1、读取文件拼装对象            
            List<EventBean> eventBeanList = null;
            
            try
            {
                eventBeanList = readWriteLockOperator.read();
            }
            catch (Exception e)
            {
                log.error(e.getStackTrace());
            }
            
            //4、删除文件
            readWriteLockOperator.delete();
            
            if (null == eventBeanList || eventBeanList.isEmpty())
            {
                return;
            }
            
            //3、成功保存到数据库(如果出现异常,如果普通异常记录失败行数,如果是数据库中断,回滚)                    
            List<EventBean> faiList = eventRepository.insertEventLink(eventBeanList);
            
            if (null == faiList || faiList.isEmpty())
            {
                return;
            }
            
            //5、对于数据库突然中断的数据,覆写回缓存文件            
            try
            {
                readWriteLockOperator.write(faiList, false);
            }
            catch (Exception e)
            {
                log.error(e.getStackTrace());
            }
        }
    }
    
}
/**
 * 文件读写操作类
 * <针对文件的续写加入读写锁,避免冲突>
 * 
 * @author  xxx
 * @version  [V1.0, 2011-9-6]
 * @see  [相关类/方法]
 * @since  [ECC/C02]
 */
@Component
public class ReadWriteLockLogic
{
    
    /**
     * 文件路径
     */
    private String path;
    
    /**
     * 初始化一个 ReadWriteLock
     */
    private ReadWriteLock lock = new ReentrantReadWriteLock();
    
    private Log log = LogFactory.getLog(ReadWriteLockLogic.class);
    
    /**
     * 读数据缓存文件
     * 
     * @return EventBean
     */
    public List<EventBean> read()
    //        throws Exception
    {
        
        // 得到 readLock 并锁定
        Lock readLock = lock.readLock();
        readLock.lock();
        
        List<EventBean> eventBeanList = new ArrayList<EventBean>();
        
        ObjectInputStream ois = null;
        
        FileInputStream fis = null;
        
        File file = new File(path);
        
        //赋予创建文件权限
        //        file.setWritable(true, false);
        
        if (!file.exists())
        {
            return null;
        }
        try
        {
            fis = new FileInputStream(file);
            
            ois = new ObjectInputStream(fis);
            
            Object obj;
            
            while (fis.available() > 0)
            {
                obj = ois.readObject();
                if (obj instanceof EventBean)
                {
                    EventBean eventBean = (EventBean)obj;
                    eventBeanList.add(eventBean);
                }
            }
        }
        catch (Exception e)
        {
            log.error(e.getStackTrace());
        }
        finally
        {
            if (null != fis)
            {
                try
                {
                    fis.close();
                }
                catch (IOException e)
                {
                    log.error(e.getStackTrace());
                }
            }
            
            if (null != ois)
            {
                try
                {
                    ois.close();
                }
                catch (IOException e)
                {
                    log.error(e.getStackTrace());
                }
            }
            
            readLock.unlock();//一定要保证锁的释放
        }
        
        return eventBeanList;
    }
    
    /**
     * 写文件
     * 
     * @param eventBeanList 事件对象
     * @param isVerride 是否覆盖
     * @return boolean 是否正确写入
     */
    public boolean write(List<EventBean> eventBeanList, boolean isVerride)
    //        throws Exception
    {
        // 得到 writeLock 并锁定
        Lock writeLock = lock.writeLock();
        writeLock.lock();
        
        //带有true参数的FileOutputStream
        EccObjectOutputStream outSteam = null;
        
        FileOutputStream fos = null;
        
        try
        {
            
            File file = new File(path);
            
            //赋予创建文件权限
            //            file.setWritable(true, false);
            
            if (!file.getParentFile().exists())
            {
                try
                {
                    if (!file.getParentFile().mkdirs())
                    {
                        return false;
                    }
                }
                catch (Exception e)
                {
                    log.error(e.getStackTrace());
                    return false;
                }
            }
            if (!file.exists() && null != eventBeanList)
            {
                try
                {
                    if (!file.createNewFile())
                    {
                        return false;
                    }
                }
                catch (Exception e)
                {
                    log.error(e.getStackTrace());
                    return false;
                }
            }
            
            fos = new FileOutputStream(file, isVerride);
            outSteam = EccObjectOutputStream.newInstance(file, fos);
            
            if (null != eventBeanList)
            {
                for (EventBean eventBean : eventBeanList)
                {
                    outSteam.writeObject(eventBean);
                }
            }
            outSteam.flush();
        }
        catch (Exception e)
        {
            log.error(e.getStackTrace());
            return false;
        }
        finally
        {
            
            if (null != fos)
            {
                try
                {
                    fos.close();
                }
                catch (IOException e)
                {
                    log.error(e.getStackTrace());
                }
            }
            
            if (null != outSteam)
            {
                try
                {
                    outSteam.close();
                }
                catch (IOException e)
                {
                    log.error(e.getStackTrace());
                }
            }
            
            writeLock.unlock();//一定要保证锁的释放
        }
        
        return true;
    }
    
    /**
     * 删除文件
     * 如果文件存在则删除文件
     * 
     * @return Boolean
     */
    public Boolean delete()
    {
        File file = new File(path);
        if (file.exists())
        {
            try
            {
                return file.delete();
            }
            catch (Exception e)
            {
                log.error("delete dbcache file faild");
                log.error(e.getStackTrace());
            }
            
        }
        return false;
    }
    
    /**
     * 判断文件是否存在
     * 
     * @return Boolean
     */
    public Boolean isExist()
    {
        
        File file = new File(path);
        
        return file.exists();
        
    }
    
    public String getPath()
    {
        return path;
    }
    
    public void setPath(String path)
    {
        this.path = path;
    }
    
}

 

/**
 * 缓存文件写入
 * 事件bean加密转换为数组写入缓存文件中
 * 
 * @author  xxx
 * @version  [版本号, 2011-9-7]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
@Component
public class WriteTask
{
    
    @Autowired
    private ReadWriteLockLogic readWriteLockOperator;
    
    /**
     * 缓存文件写方法
     * 
     * @param eventBeanList 事件对象集合
     * @return RestResponse
     */
    public RestResponse write(List<EventBean> eventBeanList)
//        throws Exception
    {
        RestResponse response = new RestResponse();
        
        //同步读写锁数据按格式写入文件(加密)         
        if (readWriteLockOperator.write(eventBeanList, true))
        {
            response.setSuccess(true);
            response.setRetCode(ReturnCode.SUCCESS);
        }
        else
        {
            response.setRetCode(ReturnCode.FAILURE);
            response.setSuccess(false);
        }
        
        return response;
    }
    
}

 

 

/**
 * 
 * 针对输出流的封装类
 * 解决序列化对象追加写入文件无法读取问题
 * @author  xxx
 * @version  [版本号, 2011-9-9]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class EccObjectOutputStream extends ObjectOutputStream
{
    /**
     * 公共文件
     */
    private static File f;
    
    /**  
     * 初始化静态文件对象,并返回类对象  
     * @param file 文件对象,用于初始化静态文件对象  
     * @param out 输出流  
     * @return MyObjectOutputStream  
     * @throws IOException  
     */
    public static EccObjectOutputStream newInstance(File file, OutputStream out)
        throws IOException
    {
        f = file;//本方法最重要的地方:构建文件对象,是两个文件对象属于同一个   
        //return new EccObjectOutputStream(out, f);
        return new EccObjectOutputStream(out);//修改pmd问题
    } 
    
    /**
     * {@inheritDoc}
     */
    @Override
    protected void writeStreamHeader()
        throws IOException
    {
        if (!f.exists() || (f.exists() && f.length() == 0))
        {
            super.writeStreamHeader();
        }
        else
        {
            super.reset();
        }
    }
    
    /**
     * <默认构造函数>
     */
    //public EccObjectOutputStream(OutputStream out, File f) //修改pmd问题
    public EccObjectOutputStream(OutputStream out)
        throws IOException
    {
        super(out);
    }
    
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    数据库系统概论第四版答案

    型描述,由数据库管理系统提供数据的安全性、完整性、并发控制和恢复能力。 文件系统与数据库系统的联系是:文件系统与数据库系统都是计算机系统中管理数据的软 件。解析文件系统是操作系统的重要组成部分;而 DBMS ...

    中安威士数据库防火墙系统(VS-FW).docx

    完善纵深防御体系,提升整体安全防护能力 避免核心数据资产被侵犯,保障业务安全运营 丰富的报表,帮助企业满足合规审计要求,快速通过评测 产品功能 屏蔽直接访问数据库的通道 数据库防火墙部署于数据库服务器和...

    [详细完整版]15数据库.doc

    分布式DBS(数据库系统):由一组数据组成的,这组数据分布在计算机网络的不同计算 机上,网络中的每一个结点具有独立处理能力,可以执行局部应用。同时每个结点能通 过网络通信子系统执行全局应用。 分布式DBMS:是...

    oracle数据库经典题目

    系统权限提供了在Oracle数据库系统范围内执行某种任务的操作能力,而对象权限则是一种赋予用户在指定的数据库对象(如表、视图、过程等) 16. Oralce数据库在进行物理备份有联机备份和脱机备份两种方式可供选择。 ...

    主题数据库分析挖掘系统参数.docx

    二、建设依据 《促进大数据发展行动纲要》(国发〔2015〕50 号) 《信息安全等级保护管理办法》(公通字〔2007〕43号) 《涉及国家秘密的信息系统分级保护管理办法》(国保发〔2005〕16号)。 《中华人民共和国献血...

    小型餐饮管理系统-数据库设计报告.doc

    (2)账单管理:账单管理包括账单号和餐台,每一个餐台对应一个一个账单号,通 过餐台号的记录来对对应的餐台进行记账管理,即就是记录每一个餐台的消费金额。账 单管理是财务管理的一个小分支,是服务于财务管理的...

    《管理信息系统》——数据库操作和数据分析.doc

    " "掌握根据实际应用情景进行初步的数据库设计的能力。 " "掌握Access数据库管理系统中关于表、关系、查询等基本操作方法。 " "二、数据分析实验目的 " "掌握Excel软件的自动筛选、条件格式和数据透视表、方案管理...

    堡垒机和数据库审计

    2 核心能力 运维管控:运维侧资产、人员权限统一管控; 运维审计:记录分析、追溯运维事件; 二 为什么要堡垒机? 1 集中管理难 主机分散(ECS数量多、业务分组多) 运维入口分散、办公网络、家庭网络均需要访问 2 ...

    机场内通系统的设计方案.doc

    1.3.1内通系统与集成系统的接口功能 1)通过内部调度通讯系统与集成系统的接口,内部调度通讯系统接口工作站实时将其前 端用户终端机的发来的登机广播和最后登机广播以及开闸、关闸等控制信息,传递给集 成系统中央...

    LSI光纤通道HBA突破I/O最高速度记录

    “由于IT管理人员都希望利用直接连接架构(Direct Connect Architecture)的优势和AMD Opteron处理器来应对象(关键任务数据库)mission-critical databases这样的企业应用软件所带来的工作量,所以通过 高性能的HBA...

    vb学生成绩管理系统

     理解面向对象的软件设计基本理论,学习VB软件设计的基本方法,熟悉一般软件项目开发的基本步骤,培养运用VB解决实际问题的能力和技巧。 课程设计的主要内容和要求(包括原始数据、技术参数、设计要求、工作量要求...

    门禁系统设计方案.doc

    5 门禁出入记录查询 33 6.5 数据库管理 33 6.5。1 数据库备份 33 6。5.2 数据库恢复 34 6.5.3 数据库配置 34 6.5.4 数据库优化 34 6。5。5 数据库初始化 34 6.6 系统工具 34 6。6。1 系统用户管理 34 6。6。2 强制...

    进销存管理系统.rar

    通过分析系统需求,设计数据库结构,编写代码实现各项功能,学生可以锻炼软件开发、数据库管理以及系统集成等多方面的实际操作能力。同时,这个项目也有助于理解企业资源规划(ERP)系统的基本概念,为将来进入职场...

    无毒空间2.0.1.227版本

    由于无毒空间的数据库不使用几百万条、几千万条病毒库的黑名单,而只使用几千条、几万条电脑用户的可信程序为判断依据,所以,运行时对电脑的性能影响不大。同时,白名单技术的最大特点就是根本不需要跟免杀技术的...

    即时通讯APP源码 IM聊天社交APP+ios可上架+安卓苹果双端+pc端+H5端+微信端

    socket 推送:GateWayWorker(支持分布式部署,高并发,抗压能力强,未采用第三方付费推送服务) 数据库:mysql 开发工具:hbuiderX,phpstorm 目前支持 android、ios,pc,h5,不提供 ios 签名、软著申请、上架服务...

    weixin183基于小程序宿舍报修系统的设计与实现ssm--论文pf.rar

    数据库设计:使用MySQL等关系型数据库存储报修数据,包括用户信息、报修记录、维修状态等。 服务器部署:将系统部署于云服务器上,确保系统的稳定运行和数据的安全可靠。 功能方面,系统通常包含以下几个主要部分:...

    level1~2题库-考试通.xlsx

    大多数数据验证控件都可以嵌入到数据库中。但是,有一些数据验证任务更适合用RPA自动化,例如将数据与公共数据进行交叉比对。 7-从PDF,扫描的文档和其他格式中提取数据 屏幕抓取,OCR(光学字符识别)和基本的...

    数据大师--通用信息管理系统(单机普通版)

    《数据大师》是专门针对各行政、企事业单位不同管理需求而设计的、独具用户自己量身定制特色且能充分发挥用户管理能力和创造力的傻瓜式通用信息(数据库)管理软件,其主要功能及特点如下: 一.适用范围广: 能...

    计算机信息处理综合作业考核大纲.doc

    作业要求:数据库(或两个数据库)的字段总数不少于8个,记录总数不少于20个。 (5)程序设计 内容:编写程序,完成某项数据处理功能、某项字符处理功能或某算法等 软件:C语言等高级程序设计语言。 作业要求:功能...

Global site tag (gtag.js) - Google Analytics