Java操作桌面(Desktop)

1.桌面操作类Desktop相关接口如下:

// 判断是否能获取到桌面
static boolean isDesktopSupported();

// 获取Desktop实例
static Desktop getDesktop();

// 启动默认浏览器并打开URI对象
void browse(URI uri);

// 打开文件或文件夹
void open(File file);

// 编辑文件
void edit(File file);

// 打印文件
void print(File file);

// 打开默认邮件客户端
void mail();

// 打开默认邮件客户端,填充由 mailto:URI 指定的消息字段
void mail(URI mailtoURI);

/*
 * 判断是否支持action行动, 参数为以下值之一:
 *     Desktop.Action.OPEN: 打开文件
 *     Desktop.Action.EDIT: 编辑文件
 *     Desktop.Action.PRINT: 打印文件
 *     Desktop.Action.MAIL: 打开邮件
 *     Desktop.Action.BROWSE: 打开浏览器
 */
boolean isSupported(Desktop.Action action);

2.Demo(打开浏览器并访问我的博客) read more

Async注解无效

@Async:由Spring提供,被标记的函数转为异步执行;使用不当则无法达到预期效果,本文主要针对添加注解无效的情况进行分析。

@Service
public class TestService{

   public void test(){
   System.out.println("TestService.test() start");
   testAsync();
   System.out.println("TestService.test() end");
   }

   @Async
   public void testAsync(){
   System.out.println("TestService.testAsync() start");
   Thread.sleep(3000);
   System.out.println("TestService.testAsync() end");
   }
}

//在外部类调用test()
//执行到testAsync()时没有异步处理

//在外部类调用testAsync()
//执行到testAsync()时异步处理

结论:
@Async注解本质上使用的是动态代理;
Spring在容器初始化的时候会将含有AOP注解的类对象替换为代理对象;
外部类调用含有AOP注解的函数时,走代理对象执行异步处理逻辑达到异步效果;
test()调用testAsync()时是自己直接调用自己,没有通过代理类,所以无效。

常用的AOP注解还有@Transactional,使用时无效也可能是如上原因导致

解决方案:
1.采用如上方式,通过外部类调用 read more

Oracle删除重复数据

需求:删除table_name表中的重复数据;判定重复的标准为:item_1,item_2,item_3的值一样,保留最新的一条

BEGIN
  LOOP
    --手动开启本次会话的并行
    ALTER SESSION ENABLE PARALLEL DML;
    --删除分组后重复数据中ROWID最小的数据
    DELETE /*+ PARALLEL(8) */ FROM TABLE_NAME WHERE ROWID IN(
    SELECT /*+ PARALLEL(8) */ MIN(ROWID) FROM TABLE_NAME A
    GROUP BY A.ITEM_1,A.ITEM_2,A.ITEM_3
    HAVING COUNT(*)>1
   );
   COMMIT;
   --手动关闭本次会话的并行
   ALTER SESSION DIABLE PARALLEL DML;
   --如受影响行数等于0,则结束循环
   EXIT WHEN SQL%ROWCOUNT=0;
  END LOOP;
END;

以上逻辑是重复数据中留下ROWID最大的那条,如需要指定留下哪一条可参考如下:留下CREATE_TIME最新的一条 read more

Oracle创建表分区

1.建表时创建分区

CREATE TABLE TABLE_NAME
(
ID VARCHAR2(64) NOT NULL,
CREATE_TIME DATE NOT NULL
--省略其他字段
)
--根据CREATE_TIME字段按年分区
PARTITION BY RANGE(CREATE_TIME) INTERVAL (NUMTOYMINTERVAL(1,'YEAR'))
(
--创建默认分区,定义初始值为当前时间
PARTITION TABLE_NAME_P1 VALUES LESS THAN (TO_DATE('2019-12-04','YYYY-MM-DD'))
);

2.相关时间计算函数 read more

OracleSequence的创建和使用

1.介绍

Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录。这个序列一般作为代理主键(因为不会重复)。
Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用。
Sequence是数据库系统的特性,有的数据库有Sequence,有的没有。比如Oracle、DB2、PostgreSQL数据库有Sequence,MySQL、SQL Server、Sybase等数据库则没有Sequence。 read more