日期:2014-05-16 浏览次数:20671 次
?? 要求数据库中断的情况下,部分功能能力放通:
?? 实现思路:本想用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());
??????????????? }
???????????