利用 JEXL 动态计算表达式

定义

Java Expression Language (JEXL) 是一个表达式语言引擎,可以用来校验数据。

背景

项目中,需要配置一些规则,然后根据动态的数据去验证规则。比如配置如下的规则:

人数大于5,并且名称包含 “test” 才能验证通过。

继续阅读

JRebel 激活地址及自建 JRebel License Server

说明

JRebel 是一款很强大的热部署工具,但是需要收费。当然收费是不可能的,我们只能想办法破解,破解的方法之一就是找一个 JRebel License Server ,用于激活。

关于激活方式以及 JRebel 插件的安装方式,可以参考我之前的博客 IDEA 下 JRebel 的安装及激活Eclipse 下 JRebel 的安装及激活

由于之前使用的 JRebel License Server 是通过网上搜索到的,突然不能使用了,因此决定自己搭建一个 JRebel License Server 。

自建的 JRebel License Server 地址

http://idea.yujunyi.com:8081/69972f4a-2911-46eb-87ed-7bbb086e4f38

继续阅读

回溯算法

定义

回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。

继续阅读

Hibernate 中对象 set 属性时自动保存入库的问题

背景

在某个项目中,通过 Heibernate 查出某个对象后,对属性进行了 set 操作,并没有进行 update 操作,但是在数据中自动保存了。

显然这并不是我想要的,我只是想 set 一下属性,在前端显示,并不想入库,但是 Heibernate 自动保存了。

// 查出对象,原来的 name 为 user1
User user = userManager.findOne(1);
// 将userName 设置为 user2 ,用于前端显示,并没有保存
user.setName("user2");
// heibernate 自动进行了保存,库中的 name 为 user2

继续阅读

kettle 教程(四):自定义 Java 代码

背景

kettle 拥有很多自带的组件,能帮我们实现很多的功能。

但是我们总有一些很复(qi)杂(pa)的需求,用自带的组件实现不了,或者说实现起来很复杂。那么这时我们就要用到万能的组件了( Java 代码),通过自己写代码来实现任何想要的功能。

继续阅读

【转】分布式锁简单入门以及三种实现方式介绍

转载自 https://blog.csdn.net/xlgen157387/article/details/79036337

一、为什么要使用分布式锁

我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!

注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!

继续阅读

MySQL 的事务隔离级别

我们先来回忆下什么是事务。

考虑一种场景。银行转账,甲转 100 给乙,分为两步:

  • 甲扣除 100
  • 乙增加 100

如果甲的钱扣了,乙的钱没有增加,那么数据就会不一致,这时候就要用到事务。因为事务的一个特性,就是原子性:要么不做,要么全做

继续阅读

kettle 教程(二):常用输出(插入更新、表输出、执行 SQL 脚本)

上一篇 文章 ,主要讲了 kettle 的原理、安装及简单的使用。其中用到了一种输出方式:插入更新。

这篇文章,主要介绍下常用的输出方式:插入更新、表输出、执行 SQL 脚本。

插入更新

插入更新,顾名思义,包括插入和更新两种情况。

我们需要先设置一个条件,符合条件时,进行更新操作;否则,进行插入操作。常见的条件就是判断表中的 ID 和流(上一个步骤的结果,可以理解为内存)中的 ID 是否相等,相等则更新;不等则插入。

继续阅读