欢迎光临BDM
一枚菜鸟码农的成仙之路

【BDM-ORM】一款链式 SQL 查询的 SQL 拼接器

huangluyu阅读(562)

最近正在开发的一个 ORM 模块,提供如下的链式 SQL 查询的方式:

List<BaseModel> sql = Table.select("person.*")
        .from(Table.select("name", "id")
                .from(Person.class), "person")
        .leftJoin(PersonInfo.class, "person.id", "pi.id", "pi")
        .where(Where.init("person.name", "=", "xiaoMing")
                .orWhere("person.id", "=", "1"))
        .andWhere("pi.password", "!=", null)
        .andWhere("person.id", "=",
                Table.select("id")
                        .from("person")
                        .where("person.id", "=", "1"))
        .get();

你会得到下列查询 SQL 产生的结果(MySQL)。

SELECT
    person.*
FROM (
    SELECT
        name, id
    FROM person
) person
LEFT JOIN person_info pi ON person.id = pi.id
WHERE (
    person.name = 'xiaoMing'
    AND person.id = '1'
)
AND pi.password IS NOT NULL
AND person.id = (
    SELECT
        id
    FROM person
    WHERE person.id = '1'
)

更多信息移步至 http://git.huangluyu.com/huangluyu/bdmorm 进行查看

JRebel配置教程(二):Tomcat独立部署

huangluyu阅读(652)

上一篇JRebel配置教程(一):注册及IDE配置(Eclipse)已经详细介绍了 JRebel 的免费注册及在 Eclipse 下的配置方法,下载插件加上简单配置即可搞定,享受快速地本地无缝编程体验,IDEA 的配置不再赘述。但在项目上线部署时,仍然有复杂的操作及漫长的等待验证时间。

今天我们来总结一下,如何使 JRebel 不依赖 IDE,独立配置在服务器上,本教程最后更新时间 2018 年 3 月 8 日。

运行环境

  • Tomcat 5.X ~ 8.X
  • JRebel
  • Linux 64 位

下载及解压 JRebel

首先从官网上下载好安装包,使用解压至服务器中存放 JRebel 的目录,Tomcat 的版本为 5.X 及 6.X 时 JRebel 的路径中不能有空格

以 CentOS 6.9 为例:

  1. 首先从官网下载好 ZIP 安装包,安装包名如jrebel-x.x.x-nosetup.zip所示,其中x.x.x为下载的版本号。
  2. 通过 FTP 工具将jrebel-x.x.x-nosetup.zip上传至服务器的~目录,也可以选取其他目录。
  3. 使用 CentOS 自带的unzip命令解压 JRebel zip 文件,如下文所示:
# 命令为:unzip JRebel-zip-路径 -d JRebel存放文件夹
unzip ~/jrebel-x.x.x-nosetup.zip -d /usr/local/JRebel

这里使用 CentOS 默认的软件文件夹/usr/local来存放 JRebel,同样也可以使用其他目录,但记得修改上述命令对应的目录路径。

激活 JRebel

执行 bin 目录下的activate.sh+激活码进行激活,如下文所示,没有激活码请查看上一篇文章进行申请。

# 命令为:%JREBEL_HOME%/bin/activate.sh 激活码
/usr/local/JRebel/bin/activate.sh rO0ABXNyAChjb20uemVyb3R1cm5hcm91bmQubGljZW5zaW5n
LlVzZXJMaWNlbnNlAAAAAAAAAAECAANMAAdkYXRhTWFwdAAPTGphdmEvdXRpbC9NYXA7WwAHbGljZW
5zZXQAAltCWwAJc2lnbmF0dXJlcQB+AAJ4cHB1cgACW0Ks8xf4BghU4AIAAHhwAAACZqztAAVzcgAR
amF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAA
AAAAAYdwgAAAAgAAAAFHQAA3VpZHQAJDljNzMwZDgzLTdkOTItNDQzMC05MWFlLTgyMGE1NTRjYmM2
NnQACGooF9BAJqZHyD+D76s=

成功后会显示JRebel successfully activated!

配置 Tomcat

官网推荐以继承脚本的方式在启动 Tomcat 前动态添加启动项来启动JRebel。

首先在$TOMCAT_HOME/bin下新建catalina-jrebel.sh,然后将下列代码粘贴进去保存退出。

#!/bin/bash
export REBEL_HOME=JRebel root folder.
export JAVA_OPTS="-agentpath:$REBEL_HOME/lib/libjrebel64.so $JAVA_OPTS"
`dirname $0`/catalina.sh $@

这样可以无需备份及修改默认的catalina.sh

然后在bin目录下运行./catalina-jrebel.sh run即可享受JRebel服务。

参考资料

  1. Running JRebel with command line

【2018.07.05已不可用】JRebel配置教程(一):免费注册及IDE配置(Eclipse)

huangluyu阅读(672)

前言

所有开发过大型 Java 系统的开发人员一定会诟病其令人发指的启动部署速度,诚然,部署时提笔练字、浏览论坛、抽烟喝水或者摸鱼放羊等操作已经是业界共识,但针对一些需要不断调试的敏感模块,还是太让人难过了。本文作者在一次又一次等待 Tomcat 部署期间,找到了一款 Eclipse 热部署软件——JRebel,减少了成吨的开发时间,下面将介绍一下此款插件的安装及部署。

 

安装与注册

JRebel 安装方式支持直接下载安装、内嵌市场安装以及输入软件源安装,本文介绍最方便快捷的内嵌市场安装,其他方式百度均有大量资料。JRebel 为收费软件,个人版485美元一年,但其下网站MyJRebel 推出了个人社交版,只需要将其绑定上 Twitter 或者 Facebook 账号即可免费获取。

 

使用 Eclipse 自带的应用市场安装 JRebel

  1. 打开应用市场

打开 Eclipse,选择菜单 Help,选择选项 Eclipse Marketplace,如图1所示。

图 1 打开 Eclipse 应用市场

  1. 安装 JRebel

打开标签页 Search,在红框1 Find 处输入 JRebel,点击红框2处的 install,开始安装。

图 2 搜索 JRebel,点击 install

  1. 安装完成,等待激活

一路点击 Next,注意,其中在第二个 Next 的时候,取消 Maven Plugin 的勾选,仅安装前两个,直至安装完成,重启 Eclipse,开始下一步。

 

在 MyJRebel 上注册社区版

  1. 注册MyJRebel

访问MyJRebel注册页面,输入邮箱及密码,点击 Next ,如图3所示。

图 3 注册MyJRebel

  1. 获取激活码

一路点击 Next,完成注册。注册后登录,在首页进行手机号以及社交账号的绑定,当然,社交账号绑定这一个操作就得八仙过海了。完成后点击左菜单栏 Install And Activate,复制图4红框2处激活码。

图 4 获取 JRebel 激活码

  1. 激活 JRebel

回到JRebel安装结束的激活页面,选择 I already have a license,在图5红框处粘贴激活码,点击右下角 Active,即可安装成功。

图 5 激活License

 

部署与运行

至此,JRebel 已经安装完成。关于 JRebel 热部署的实现机制,已有大量的资料,故此处不再赘述,但正式使用 JRebel 之前,仍然需要几步准备工作。

 

增大Java栈内存空间

Java 默认栈内存非常小,我在开发公司的系统时,系统里大量 jar 包都将在启动时消耗栈内存空间,而垃圾回收机制并不会对启动过程中的栈内存生效。加之 JRebel 也需要增加20%栈内存使用的情况下,使用公司系统默认的本地开发配置参数,必然会报出OutOfMemoryError: PermGen space的错误。下面将介绍 JVM 启动参数设置的方法,该设置会覆盖所有其他地方的同名参数设置。

  1. 打开设置菜单

打开菜单栏 Window > Preference,选择 Java > Install JREs,点选右边区域中 Tomcat 使用的 JRE,然后点击 Edit,如图6所示。

图 6 JRE设置

  1. 添加启动参数

在红框1处添加启动参数,至少一项 -XX:MaxPermSize=1024m,如果仍然有栈内存超出的错误,继续增大该数值。点击 Finish,完成设置。

图 7 添加JVM启动参数

 

简单配置JRebel运行

关于 JRebel 初始化设置,官方教程有更详细清晰的介绍。注意第三步中,使用 Eclipse 开发是 Run via IDE,然后继续执行教程步骤即可。

 

后记

至此,JRebel 已经完全设置完毕。在 Eclipse 里开启 Tomcat,将看到 Console页面下,伴随着 Tomcat 的启动 JRebel 疯狂操作的 Log。微略增加启动时间后,与之俱来的是无尽的便捷。项目中修改Java文件后,点击Ctrl + s保存,JRebel将自动完成重新部署该class的操作,仅在修改了框架启动过程中需要加载的配置文件的情况下,才需要重新启动应用。

如果安装过程中遇到了问题,则回顾一下上文中加粗的部分,那里每一个字都是前人踩过的坑。

简述PHP与JAVA的主要区别

huangluyu阅读(664)

PHP与JAVA的主要区别

本总结中前后几点之间通常存在因果或者关联关系,因为想要描述语言之间的差距,总是由点概面的。希望能通过关键性质的几点,来描绘出PHP和JAVA这两种工具间基本的区别。

该总结内容结合自身经验得出,深度及广度取决于作者的水平,望能海涵!

1. 数据类型

  • PHP为弱类型语言,JAVA为强类型语言。
  • PHP所有数据类型采用同一种数据结构,该结构体中包含了“数据”,“数据的长度”,“数据引用”的信息。其中“数据”底层实现为一个联合体,包含了整形,长整型,字符串,对象,哈希表几种类型。字符串类型为一个结构体。

2. 应用场景

  • PHP为web开发而生,只能用于web开发。
  • PHP进行web开发时不依赖任何框架,但运用上框架也能达到JAVA框架的很多优点,诸如MVC,面向切面,依赖注入。
  • PHP内置模板引擎,JAVA需要依赖其他类库。

3. 语言类型

  • PHP为脚本语言,在执行时编译,JAVA为半编译语言,在执行前编译。
  • PHP实时热部署,部署速度取决于存储介质读写速度。
  • PHP底层为C语言,所有类库都是C实现,而JAVA是JAR包,仍然是JAVA。

4. 多线程

  • PHP每一个请求都是一个进程,JAVA每一个请求都是一个线程。
  • PHP能完美利用多核性能。

5. 数据库连接

  • PHP天然不支持连接池,除非运用到常驻内存以及进程间通讯等相关技术。
  • PHP数据库连接底层为C,效率更高,能弥补一定的IO成本。

6. 垃圾回收

  • PHP的运行时GC机制为当该数据没有被引用时回收,该标识符存储在数据本身之中,参考1.数据类型。
  • PHP在请求结束时释放该进程所占的空间,常驻内存空间基本为0。
  • PHP使用命令能随时随地释放对象所占的空间,JAVA即使使用命令也必须等待垃圾回收。

7. 面向对象

  • PHP支持面向过程和面向对象两种方式,执行HelloWorld只需要一条语句。
  • 基于PHP是弱类型语言,PHP的对象也是一种结构非常松散的对象,更像是静态方法的集合加上数据的集合。

8. 面向接口

  • PHP的面向接口因为弱类型而非常不严谨,无法定义接口的返回类型和参数类型,导致面向接口被PHP社区默认为保留特性。

9. 语言特性

  • PHP拥有文件包含- 机制,使用语句引入另一个文件之后可以识别并包含引入其中的内容。
  • PHP拥有析构函数,可以在对象释放时(被引用为0之前)执行。
  • PHP不支持重载,可使用可变参数的函数曲线救国。
  • PHP默认方法及变量的权限是public。

后记

这篇对比文章写于大半年前刚刚由 PHP 转 Java 的时候,从那之后就投身入 Java 的怀抱,很少继续想过这个问题,今天面试很意外地被问到了这个问题,一时间竟然有点语无伦次。要放在半年前,这个问题我或许有清晰的答案,也能侃侃而谈谁是世界上最好的语言。但对于现在的我来说,再度思考这个问题,却有着许多不同的角度。

语言终归都是一门工具,对于普通开发者来说,工具只要能知道如何使用,方便使用,便能成为开发者实现自身价值的利器。放到这个问题来说,这篇文章里列出的语言特性所展现的差异,仿佛就无足轻重了。对于一个架构设计者来说,或许市场上是否已有成型的技术生态,是否流通着丰富的技术从业者,更影响对技术选型的判断。对于开发者来说,是否能快速掌握这门工具的使用,是否有足够的途径来支撑学习的过程,可能更为关键。

我们无法否认 PHP 简单易上手、快速构建应用的优点,也无法忽略 Java 在大型企业级服务构建中几十年来积累的丰富的经验,还是得参照各方面的因素进行抉择。

人生苦短,我选 PHP Python

联系我们GitHub