通过数据库给文件加锁
前几天有个应用需要多台服务器同时读取网络上的文件,一个文件只能一台服务器可以读取,首先想到的是 NIO 的文件锁(FileLock),不知道对网络上的文件是否可以加锁,没有测试过。为了通用,想到了用数据锁某条记录的方式来实现。
通过数据库的同步事务(ISOLATION_SERIALIZABLE)来实现。
类似 spring 事务的处理方式,使用 AOP 实现。
实现原理,定义 Dblock注解,让后拦截添加注解的的方法。可以设置锁记录的 ID,或数据库中的查找的某一个字符串。
注解定义:
package cn.pc.ua.util.aop;@Target(value = ElementType.METHOD)@Retention(value = RetentionPolicy.RUNTIME)public @interface DbLock {public String value() default "";public int id() default Integer.MIN_VALUE;}@Pointcut("@annotation(cn.pc.ua.util.aop.DbLock)")//切点private void pointCutMethod() {}@Around("pointCutMethod()")public Object doAround(ProceedingJoinPoint pjp) throws Throwable {DefaultTransactionDefinition arg0 = new DefaultTransactionDefinition();arg0.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);TransactionStatus ts = txManager.getTransaction(arg0);//.....Object object = pjp.proceed();log.debug("release db lock !");txManager.commit(ts);//.....}