Java
文章平均质量分 73
老马啸西风
Github: https://github.com/houbb
Email:houbinbin.echo@gmail.com
展开
-
java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架
产品需求产品经理需要导出一个页面的所有的信息到 EXCEL 文件。需求分析对于 excel 导出,是一个很常见的需求。最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件。客户体验 & 服务性能客户体验如果导出的文件比较大,比如几十万条数据,同步导出页面就会卡主,用户无法进行其他操作。服务性能导出的时候,任务比较耗时就会阻塞主线程。如果导出的服务...原创 2018-11-26 21:52:07 · 30209 阅读 · 0 评论 -
手写 Hibernate ORM 框架-03-Hibernate 配置文件读取, 数据库连接构建
目录目录本节内容hibernate.cfg.xml 读取文件内容读取测试构建 Connetion目录导航本节内容hibernate.cfg.xml 配置文件的读取数据库访问 Connection 的构建hibernate.cfg.xml 读取当然,代码中为了快速模拟,我们也可以将属性 hard code。但此处为了模拟,就进行简单的实...原创 2018-05-02 22:26:11 · 40825 阅读 · 0 评论 -
手写 Hibernate ORM 框架-02-实体 Bean 定义,建表语句自动生成
目录目录本节内容定义实体 BeanTable实现测试Table 中涉及到的工具类FieldUtilTableUtilReflectionUtilStringBuilderUtilStringUtilCollectionUtil目录导航本节内容实体 Bean 的定义。根据实体 Bean 生成对应的建表语句。定义实体 Bean...原创 2018-05-02 22:18:53 · 41179 阅读 · 0 评论 -
手写 Hibernate ORM 框架-01-注解定义、常量定义
目录目录本节内容注解定义@Entity@Column@Id@GenerateValue常量定义HibernateConstant.javaTypeMap.java目录导航本节内容进行 Hibernate 的注解定义,常量定义注解定义直接模拟 Hibernate 定义几个最常见的注解。@Entitypackage co...原创 2018-05-02 21:38:56 · 41053 阅读 · 0 评论 -
手写 Hibernate ORM 框架-00-环境准备
导航手写 Hibernate ORM 框架-00-环境准备手写 Hibernate ORM 框架-01-注解定义、常量定义手写 Hibernate ORM 框架-02-实体 Bean 定义,建表语句自动生成手写 Hibernate ORM 框架-03-Hibernate 配置文件读取, 数据库连接构建手写 Hibernate ORM 框架-04-数据库交互,数据持久化目录...原创 2018-05-02 21:24:36 · 43433 阅读 · 1 评论 -
英文单词拼写纠正(错误检查)的java实现-word-checker
问题引入平时工作学习中,对于单词拼写检查也是很常见的需求。 一直没找到特别好用的版本,就自己写一个。方便以后拓展和他人使用。项目简介本项目用于英文单词拼写检查。 word-checker快速开始JDK 版本JDK1.7 及其以后入门例子maven 引入本项目已经上传到 maven 仓库,直接引入即可<dependency...原创 2018-05-02 19:40:41 · 50164 阅读 · 0 评论 -
Quartz 入门系列教程-04-Triggers 深入学习
Triggers和 jobs 一样,触发器也很容易使用,但确实包含了各种可定制的选项,在充分使用Quartz之前,您需要了解并了解这些选项。另外,正如前面提到的,您可以选择不同类型的触发器来满足不同的调度需求。后面将会深入讨论: Simple Triggers & Cron Triggers.Common Trigger Attributes除了所有触发器类型都有触发键...原创 2018-04-02 20:47:04 · 40501 阅读 · 0 评论 -
Quartz 入门系列教程-02-Jobs 和 Trigger
Quartz API主要接口定义如下:The key interfaces of the Quartz API are:Scheduler - the main API for interacting with the scheduler.Job - an interface to be implemented by components that you wish to have...原创 2018-04-02 20:45:39 · 40752 阅读 · 0 评论 -
Quartz 入门系列教程-01-入门案例
QuartzQuartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-comm...原创 2018-04-02 20:43:34 · 40826 阅读 · 0 评论 -
Quartz 入门系列教程-00-序章
Quartz任务调度是我们平时的业务开发中很常见的需求之一。Quartz 又是其中十分优秀的框架。本系列主要是将 Quartz 的官方文档进行简单整理。希望帮助大家入门。后续如果有时间,再写一点关于 Quartz 的使用心得。目录导航Quartz 入门系列教程-00-序章Quartz 入门系列教程-01-入门案例Quartz 入门系列教程-02-Jobs 和 T...原创 2018-04-02 20:40:51 · 43812 阅读 · 0 评论 -
Quartz 入门系列教程-12-其他特性
特性Plug-InsQuartz 提供了一个接口(org.quartz.spi.SchedulerPlugin)插入识别j2ee附加功能。可以在 org.quartz.plugins 文件夹下找到与Quartz一起提供各种实用功能的插件。 它们提供了一些功能,例如在调度器启动时自动调度作业、记录作业历史和触发事件,并确保当JVM退出时调度程序会自动关闭。JobFactor...原创 2018-04-08 16:53:43 · 40637 阅读 · 0 评论 -
Quartz 入门系列教程-11-高级特性
Advanced (Enterprise) FeaturesClustering集群目前使用JDBC-Jobstore (JobStoreTX或JobStoreCMT)和TerracottaJobStore。特性包括负载平衡和工作故障转移(如果JobDetail的“请求恢复”标志设置为true)。通过设置“org.quartz.jobStore”,将集群与JobStoreTX或...原创 2018-04-08 16:52:40 · 40754 阅读 · 0 评论 -
手写 Hibernate ORM 框架-04-数据库交互,数据持久化
目录目录本节内容执行建表语句Session测试数据的持久化测试构建测试入库目录导航本节内容执行建表语句。执行数据的保存执行建表语句Sessionpackage com.ryo.hibernate.simulator.hibernate;import com.mysql.jdbc.PreparedStatement;...原创 2018-05-02 22:36:20 · 40917 阅读 · 0 评论 -
轻松学习多线程-05-Balking 模式
目录目录Balking 模式实际案例定义测试实现方式UML & CodeUMLCode系列导航Balking 模式Balking 模式是指如果不适合执行这个操作,或者没必要执行这个操作,就停止操作,直接返回。实际案例类信息概览: 类名 说明 Main.java 方法的总入口 SaveTh...原创 2018-04-25 18:10:40 · 40691 阅读 · 0 评论 -
java 内存模型-01-JSR 133
Java Memory Model简介在多处理器系统中,处理器通常有一个或多个内存缓存层,通过加速对数据的访问(因为数据离处理器更近)和减少共享内存总线上的流量(因为许多内存操作可以由本地缓存来满足),提高性能。内存缓存可以极大地提高性能,但是它们带来了许多新的挑战。例如,当两个处理器同时检查相同的内存位置时,会发生什么?在什么条件下它们会看到相同的值?在处理器级别,内存模型定...原创 2018-09-14 12:12:06 · 18422 阅读 · 0 评论 -
java retry(重试) spring retry, guava retrying 详解
系列说明java retry 的一步步实现机制。 java-retry 源码地址情景导入简单的需求产品经理:实现一个按条件,查询用户信息的服务。小明:好的。没问题。代码UserService.javapublic interface UserService { /** * 根据条件查询用户信息 * @par...原创 2018-08-08 18:01:54 · 17273 阅读 · 2 评论 -
强一致性hash实现java版本及强一致性hash原理
一致性 hash分布式过程中我们将服务分散到若干的节点上,以此通过集体的力量提升服务的目的。然而,对于一个客户端来说,该由哪个节点服务呢?或者说对某个节点来说他分配到哪些任务呢?强哈希考虑到单服务器不能承载,因此使用了分布式架构,最初的算法为 hash() mod n, hash()通常取用户ID,n为节点数。此方法容易实现且能够满足运营要求。缺点是当单点发生故障时,系统无法自动恢...原创 2018-08-14 23:28:54 · 30699 阅读 · 0 评论 -
java 英文单词拼写纠正框架(Word Checker)
Word Checker本项目用于单词拼写检查。项目简介本项目用于单词拼写检查。 特性说明支持 i18n错误提示支持 i18N支持英文的单词纠错可以迅速判断当前单词是否拼写错误可以返回最佳匹配结果可以返回纠正匹配列表,支持指定返回列表的大小后续将会添加的新功能英文单词支持自行定义中文单词的拼写是否正确功能添加 ...原创 2018-08-11 09:48:07 · 31402 阅读 · 0 评论 -
java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring EventListener,超时处理和空循环性能优化
异步转同步业务需求有些接口查询反馈结果是异步返回的,无法立刻获取查询结果。正常处理逻辑触发异步操作,然后传递一个唯一标识。等到异步结果返回,根据传入的唯一标识,匹配此次结果。如何转换为同步正常的应用场景很多,但是有时候不想做数据存储,只是想简单获取调用结果。即想达到同步操作的结果,怎么办呢?思路发起异步操作在异步结果返回之前,一直等待(可...原创 2018-08-10 23:51:57 · 16996 阅读 · 0 评论 -
Java 性能测试框架工具-JunitPerf
目录目录性能测试工具junitperf特性使用例子maven 引入 jar测试代码测试结果日志形式HTML 形式性能测试工具对于 Java 开发者来说,要去学习性能测试工具未免很麻烦。但有时候会有性能测试的需求。junitperfjunitperf 就是一款为 Java 开发者设计的性能测试框架,如果你会 Junit,很容易...原创 2018-05-05 14:08:13 · 45383 阅读 · 0 评论 -
轻松学习多线程-11-Two Phase Termination 模式
目录目录Two Phase Termination 模式模式特点实际案例定义测试实现方式UML & CodeUMLCode系列导航Two Phase Termination 模式Two Phase Termination 模式表示先执行完终止处理,再终止线程的模式。模式特点安全的终止线程必定会进行线程终止发出请求后...原创 2018-04-26 19:06:22 · 40714 阅读 · 0 评论 -
轻松学习多线程-08-Thread Per Message 模式
目录目录Thread Per Message 模式实际案例定义测试实现方式UML & CodeUMLCode系列导航Thread Per Message 模式Thread Per Message 模式是指为每个请求/命令分配一个新的线程,由这个线程来进行处理。实际案例类信息概览: 类名 说明 Mai...原创 2018-04-25 18:39:55 · 40728 阅读 · 0 评论 -
轻松学习多线程-07-Read Write Lock 模式
目录目录Read Write Lock 模式实际案例定义测试实现方式UML & CodeUMLCode系列导航Read Write Lock 模式Read Write Lock 模式就是将内容的读取和写入分开进行处理。因为数据的互斥需要牺牲性能,读的时候可以互不影响,但是读的时候禁止写。实际案例类信息概览: ...原创 2018-04-25 18:29:51 · 40753 阅读 · 0 评论 -
轻松学习多线程-06-Producer Consumer 模式
Producer Consumer 模式Producer Consumer 模式是指一个负责生产,一个负责消费。核心是生产者安全地将数据交给消费者。实际案例类信息概览: 类名 说明 Main.java 方法的总入口 ConsumerCakeThread.java 消费蛋糕的线程 Table.java 放置蛋糕的桌子 Bl...原创 2018-04-25 18:21:28 · 40763 阅读 · 0 评论 -
Quartz 入门系列教程-10-Configuration
Configuration, Resource Usage and SchedulerFactoryQuartz的架构是模块化的,因此要让它运行几个组件,需要将其“断开”。幸运的是,存在一些帮助实现这种情况的助手。在Quartz能够完成其工作之前,需要配置的主要组件是:ThreadPoolJobStoreDataSources (if necessary)The Schedul...原创 2018-04-08 16:51:30 · 41425 阅读 · 0 评论 -
Quartz 入门系列教程-09-Job Stores
Job StoresJobStore 负责跟踪您给调度器的所有“工作数据”:作业、触发器、日历等等。为您的Quartz scheduler实例选择合适的JobStore是一个重要步骤。幸运的是,一旦你理解了它们之间的区别,选择应该是非常简单的。您在属性文件(或对象)中声明您的调度器应该使用哪个 JobStore (以及它的配置设置),您可以使用它来生成调度程序实例。注意不要直接在代...原创 2018-04-08 16:50:08 · 41573 阅读 · 0 评论 -
Quartz 入门系列教程-08-SchedulerListeners
SchedulerListeners调度器很像触发监听器(TriggerListeners)和工作监听器(JobListeners),除非它们接收到调度程序本身中的事件通知——不一定是与特定触发器或作业相关的事件。与调度相关的事件包括:添加作业/触发器、删除作业/触发器、调度程序中的严重错误、调度程序被关闭的通知等。SchedulerListeners 接口public i...原创 2018-04-08 16:48:44 · 40532 阅读 · 0 评论 -
Java中文繁简体转换工具
创作缘由对于中文的繁简体转换是一种很常见的需求。但是很多工具类都是简单的做个映射。(使用map,集合,properties)等。存在一个严重的问题:特殊词组 的转换可能存在问题。OpenCCOpenCC 是一款非常优秀的转换工具。但是没有直接提供 Java 便于使用的 jar。opencc4jopencc4j 就是在上面的工具基础上提供的 java 使用版本。...原创 2018-02-13 18:17:31 · 42190 阅读 · 4 评论 -
轻松学习多线程-00-序章
目录导航轻松学习多线程-00-序章轻松学习多线程-01-基础知识轻松学习多线程-02-Single Threaded Execution 模式轻松学习多线程-03-Immutable 模式轻松学习多线程-004-Guarded Suspension 模式轻松学习多线程-05-Balking 模式轻松学习多线程-06-Producer Consumer 模式轻松学习多...原创 2018-02-26 13:56:53 · 43232 阅读 · 0 评论 -
轻松学习多线程-01-基础知识
基础知识下面是一些关于 java 线程的基础知识博客。需要补充知识的可以浏览一下,已经熟悉的可以直接跳过。线程-001-线程简介线程-002-基本的线程机制线程-003-线程的同步与锁线程-004-线程间的协作及状态迁移多线程代码的评定标准对于代码的评定不应该停留于好坏,而应该指出好在哪里?或者坏在哪里?下面简单地谈一下 Doug Lea 的评价标准。 如...原创 2018-02-26 17:05:40 · 39688 阅读 · 0 评论 -
线程-004-线程间的协作及状态迁移
状态迁移图常言道,一图胜千言。线程协作我们前面讲到使用 synchronized 进行线程间的互斥。 但,如果我们需要更加精确地控制。比如:如果空间为空则写入,如果非空则一直等待。空间已经为空时,“通知”其他等待的线程。为此,JDK 为我们准备了 wait()、notify()、notifyAll() 等方法,用于线程的控制。等待队列所有的实例都拥有...原创 2018-02-26 16:37:19 · 39549 阅读 · 0 评论 -
为 github markdown 文件生成目录(toc)
缘起有需求,才有创作。每次写 github 上的 README.md,内容较多时阅读不方便,也没有自动生成的 TOC(目录)。于是就自己写了一个。markdown-tocmarkdown-toc可以根据 atx(# 指定标题) 标题形式的 markdown 文件生成对应目录。效果展示BeforeAfter原创 2018-01-30 17:28:26 · 62420 阅读 · 0 评论 -
轻松学习多线程-02-Single Threaded Execution 模式
Single Threaded Execution这座桥,一次只能过一个人。情景引入使用程序模拟三个人频繁通过一个只允许通过一个人的门。 每次有人通过,人数统计便会增加。 每次通过,都会校验通过者的信息。普通方式定义Gate.java定义接口。/** * 接口 * @author bbhou */public interface Ga...原创 2018-02-28 10:42:02 · 39669 阅读 · 0 评论 -
轻松学习多线程-03-Immutable 模式
Immutable想破坏也破坏不了。 Immutable 可以确保实例状态不发生改变,访问这类实例时不需要执行耗时的互斥处理,可以提升性能。实际案例定义Person.java不可变对象类/** * 不可变类 * * @author bbhou * @version 1.0.0 * @since 1.0.0 */public final class Person { priv原创 2018-03-01 17:09:57 · 39630 阅读 · 0 评论 -
Quartz 入门系列教程-07-TriggerListeners-JobListeners
监听者Listeners 是您根据调度程序中发生的事件创建的对象。正如您可能猜到的那样,triggerlistener 接收与触发器相关的事件,而 joblistener 接收与作业相关的事件。TriggerListener 接口Trigger 事件包括:触发触发,触发错误触发(在本文档的“触发器”部分中讨论),触发完成(触发器触发的工作完成)。public inter...原创 2018-04-08 16:47:38 · 40685 阅读 · 0 评论 -
Quartz 入门系列教程-06-CronTrigger
CronTriggerCronTrigger 通常比 SimpleTrigger 更有用,如果您需要根据日历类的概念而不是精确指定的简单触发器间隔来重新定义作业调度。有了CronTrigger,你可以指定诸如“每个周五中午”,或“每个工作日和上午9:30”,甚至“每星期一、星期三和周五上午9:00到10:00之间的每5分钟”。 即使是这样,像SimpleTrigger一样,CronTri...原创 2018-04-08 16:45:43 · 40580 阅读 · 0 评论 -
Quartz 入门系列教程-05-SimpleTrigger
SimpleTrigger如果您需要在特定的时间内精确地执行一次任务,或者在特定的时间间隔内重复执行某个特定的时间间隔,那么SimpleTrigger应该满足您的调度需求。举个例子,如果你想在2015年1月13日上午11:23:54的时候触发,或者你想在那个时候触发,然后再触发5次(间隔 10S)。有了这个描述,您可能不会惊讶地发现一个简单触发器的属性包括:开始时间、结束时间、重复计数...原创 2018-04-08 16:44:20 · 40594 阅读 · 2 评论 -
Quartz 入门系列教程-03-Jobs 深入学习
More About Jobs and Job Details虽然您实现的作业类具有知道如何完成特定类型作业的实际工作的代码,但 Quartz 需要了解您可能希望该作业的实例拥有的各种属性。这是通过JobDetail 类完成的,该类在前一节中简要介绍过。JobDetail 实例是使用 JobBuilder 类构建的。您通常希望使用所有方法的静态导入,以便在代码中有 dsl-feel。...原创 2018-04-08 16:03:24 · 40679 阅读 · 0 评论 -
Java8 实战系列-06-lambda 方法引用
方法引用方法引用可以看作仅仅调用特定方法方法的 lambda 的一种快捷的方式。显示的指定方法的名称,可读性会更好。代码示例/** * 方法引用 */@Testpublic void functionRefTest() { Apple one = new Apple(20); Apple two = new Apple(10); List&l...原创 2018-03-20 21:19:43 · 40247 阅读 · 0 评论 -
Java8 实战系列-05-lambda 类型推断
类型检查Lambda 的类型是从 Lambda 的上下文推断出来的。上下文中 Lambda 表达式需要的类型称为 目标类型。图示如下同样的 lambda,不同的函数接口/** * 相同的 lambda 表达式,但是不同的函数接口 * 只要他们的抽象方法签名可以兼容。 */@Testpublic void sameLambdaDiffFunctional()...原创 2018-03-20 21:17:58 · 40887 阅读 · 0 评论