原创 spring+mybatis+druid數據源+sharding-jdbc分庫分表

首先我們看下如何讓spring與mybatis集成,我使用的是mysql數據庫,建庫建表語句如下: drop database if exists demodb00; CREATE database demodb00 DEFAULT CH

原创 maven項目常用技巧:將依賴打包到文件夾並生產可執行的jar

我maven項目結構如下: pom.xml內容如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLS

原创 guava-retrying重試工具庫: 什麼時候重試

作爲一個重試庫,首先要解決的問題就是什麼時候重試。爲了使用guava-retrying,我們需要在pom.xml中加入依賴: <dependency> <groupId>com.google.guava</groupId> <arti

原创 加密算法之:對稱加密與非對稱加密掃盲貼

對稱加密:加密(encryption)與解密(decryption)使用的是同樣的密鑰(secret key)。加密和解密算法是公開的,祕鑰必須嚴格保存,如果祕鑰泄露,別人就能夠用密文+祕鑰還原成你的明文。比如常見的DES/AES都是屬於

原创 guava-retrying重試工具庫: 什麼時候終止

當我們重試到一定階段的時候,需要終止重試過程,比如重試了n次或者重試了n秒等。 StopStrategies.stopAfterAttempt(n):在重試了n次後終止,這個實際中最常用。 import com.github.rhold

原创 guava-retrying重試工具庫: 阻塞策略BlockStrategy

什麼是阻塞策略呢?通過前面的學習,我們知道guava-retrying是可以設置2次重試的時間間隔的。比如第一次失敗後,需要等待200ms再開始第二次嘗試,也就是說線程需要等待200ms。實現200ms等待有多種方式,比如通過sleep方

原创 熟練使用java的Enum、EnumSet、EnumMap

對java枚舉一直沒有系統學習過,之前就是用枚舉來替代接口中的常量,今天看到同事寫的一段代碼使用了EnumSet,不是特別熟悉。於是重新學習了Enum、EnumSet、EnumMap。 首先看下最基本的枚舉使用場景: public en

原创 遍歷java集合或數組的幾種方式

以數組爲例,基本上有下面4種常見的遍歷方式: public class Test { public static void main(String[] args) { // 方式1 for (i

原创 guava-retrying重試工具庫: RetryListener

當發生重試之後,假如我們需要做一些額外的處理動作,比如發個告警郵件啥的,那麼可以使用RetryListener。每次重試之後,guava-retrying會自動回調我們註冊的監聽。可以註冊多個RetryListener,會按照註冊順序依次

原创 JDK8新特性:使用Optional避免null導致的NullPointerException

空指針異常是導致Java應用程序失敗的最常見原因。以前,爲了解決空指針異常,Google公司著名的Guava項目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵程序員寫更乾淨的代碼。受到Google Gua

原创 JDK8新特性:重複註解Repeating Annotations

註解並不是什麼新鮮東西了,比如spring中存在大量註解簡化我們的配置。但是在JDK8之前,我們是不能使用重複註解的,即某個位置相同註解只能出現一次。 比如我們想編寫一個定時任務的註解,使用者可以配置在每天哪一小時觸發,而且允許用戶配

原创 JDK8新特性:使用stream、Comparator和Method Reference實現集合的優雅排序

大家對java接口Comparator和Comparable都不陌生,JDK8裏面Comparable還和以前一樣,沒有什麼改動;但是Comparator在之前基礎上增加了很多static和default方法。本文主要結合JDK的stre

原创 消息摘要、MAC(消息認證碼)、數字簽名掃盲貼

本文主要是對維基百科的翻譯,原文Message authentication code。 In cryptography(密碼學), a message authentication code (MAC) is a short piec

原创 guava-retrying重試工具庫: AttemptTimeLimiter

AttemptTimeLimiter和guava的TimeLimiter基本是一樣的,是爲了限制某個任務的執行時間。比如我希望一個Callable任務執行時間不超過5s,如果超過拋異常TimeoutException。 import co

原创 SimpleDateFormat不是線程安全的類

見過很多類似下面的代碼: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class D