悲观锁、乐观锁,浅析

悲观锁和乐观锁是并发控制常用的两种技术手段。
并发控制是用来确保 多个事务同时读写DB中同一条数据时不破坏事务的隔离性、统一性以及数据库的统一性。

……

阅读全文

fatal could not read Username for 'https://github.com' terminal prompts disabled

跟往常一样,一日不升级本机包版本就一日不舒服。今天就踩坑了 ➜ ~ brew update fatal: could not read Username for 'https://github.com': terminal prompts disabled Error: Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-completions failed! 怎么解决呢? ➜ ~ brew untap homebrew/homebrew-completions Untapping homebrew/completions... Untapped (105 files, 71.0KB). ➜ ~ brew update Already up-to-date. ……

阅读全文

学习SpringBoot系列 -04- 多数据源 + Druid

前面两个小节记录下了多数据源和 Druid ,本节综合起来,记录下使用 Druid 结合多数据源。跟实际项目更贴切一些。 学习SpringBoot系列 -02- 多数据源 学习SpringBoot系列 -03- 使用Druid数据库连接池 首先,需要结合前面两节的修改内容,也就是增加 properties 配置文件的多数据源配置;然后修改 pom 文件的依赖配置。为方便查看,这里再贴下修改结果。 1. application.properties 中的相关配置 foo.datasource.url=jdbc:h2:mem:foo foo.datasource.username=sa foo.datasource.password= bar.datasource.url=jdbc:h2:mem:bar bar.datasource.username=sa bar.datasource.password= 2. pom.xml 中的相关配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency> 3. 数据源类型 同样的,需要对数据源配置类进行添加,可以参考第二小节的内容。 到这里就结束了么? No…No…No, 如果此时运行程序,你会收到下面这个报错: ... Caused by: java.lang.IllegalStateException: No supported DataSource type found ... 报错信息提示已经很明显了,dataSource的Type项有错,只需要分别在foo和bar的数据源配置类中添加下配置即可: dataSourceProperties.setType(com.alibaba.druid.pool.DruidDataSource.class); 这个时候再跑一下,就正常了。 借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

学习SpringBoot系列 -03- 使用Druid数据库连接池

SpringBoot 在1.x默认使用的是 Tomcat 连接池; SpringBoot 在2.x默认使用的是 Hikari 连接池; 那么, 如何在SpringBoot工程中使用优秀的 Druid 连接池呢? 关于 Hikari 与 Druid 的那些事,有兴趣的可以这个 issue , 简单来说,各有所长。前者可以认为是个纯粹的数据库连接池,后者同时注重监控、可运维等能力扩展,且有阿里背书,经过大量验证. 1. 添加 Druid 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency> 2. 移除 Hikari 依赖(可选)(建议移除) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> 关于 Druid 的一些配置,这里就不展开了。 借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

学习SpringBoot系列 -02- 多数据源

如何在SpringBoot工程中配置多数据源呢? 1. 排除掉自动引入的数据源相关配置 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class }) public class HelloJdbcApplication { public static void main(String[] args) { SpringApplication.run(HelloJdbcApplication.class, args); } } 2. 新增数据源配置信息 application.properties // 这里以H2演示,后面更新 foo.datasource.url=jdbc:h2:mem:foo foo.datasource.username=sa foo.datasource.password= bar.datasource.url=jdbc:h2:mem:bar bar.datasource.username=sa bar.datasource.password= 3. 新增数据源配置类 3.1 foo 数据源的配置类 @Configuration public class FooDataSourceConfiguration { @Bean @ConfigurationProperties("foo.datasource") public DataSourceProperties fooDataSourceProperties() { return new DataSourceProperties(); } @Bean public DataSource fooDataSource() { DataSourceProperties dataSourceProperties = fooDataSourceProperties(); return dataSourceProperties.initializeDataSourceBuilder().build(); } @Bean @Resource public PlatformTransactionManager fooTxManager(DataSource fooDataSource) { return new DataSourceTransactionManager(fooDataSource); } } 3.……

阅读全文

学习SpringBoot系列 -01- 移除parent依赖

借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如题,常常项目中会要求统一一个 parent 依赖,而SpringBoot工程默认的 parent 是 spring-boot-starter-parent ,那么如何移除掉这个依赖以便使用其他的parent呢?官方已经考虑到这个问题了,很简单,可以这么做: 1. 在 pom.xml 配置文件中,增加下面这段依赖(当前版本号最新是2.1.3,请根据实际需要进行更改) <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 2. 在 pom.xml 配置文件中,更改 build 块的配置如下 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.3.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

挂PT方案 docker + deluge-flexget

剁手了一台低配独服,剁手了发现似乎并不能完全利用到,没有好的点子。除了硬盘大了一些外,一无是处,CPU垃圾、内存小、远在北欧,然而硬盘也是被使用了3w+小时的烂盘…… 作为独服,好处就是不用担心持续的高IO、高CPU占用了,23333 暂时没有好的利用的地方,刚好有个就放个PT吧,贡献点资源… 0. 创建普通用户 我比较喜欢用app这个普通用户来管理安装的应用 # useradd app # passwd app # usermod -a -G wheel app 1. 安装 // docker // 安装 # curl -fsSL https://get.docker.com/ | sh // 使app用户可以使用 $ sudo usermod -aG docker app // 启动 $ sudo systemctl start docker // 开启自启 $ sudo systemctl enable docker // n3mur1t0r/deluge-flexget // 拉镜像 $ docker pull n3mur1t0r/deluge-flexget // 创建容器 $ docker create --name deluge --net=host -e PUID=1001 -e PGID=1001 -e TZ=Europe/Paris -v /home/app/downloads:/downloads -v /home/app/deluge/config:/config n3mur1t0r/deluge-flexget // 启动 $ docker start deluge // 查看运行日志 $ docker logs deluge -f // 进入容器shell $ docker exec -it deluge /bin/bash 这个时候,访问http://SERVER_IP:8112 就可以打开webUI了(记得放行8112端口)。笔者不喜欢放行那么多的端口,就在前面加了nginx来实现代理。大致的配置如下:……

阅读全文

perl Setting locale failed, Please check that your locale settings

在Centos把shell改为zsh后,出现了下面这个waring信息,虽不影响使用,但看着实在是烦人. perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). 查了一些资料,可以通过在.zshrc中增加两行配置来解决这个问题 LC_CTYPE=en_US.UTF-8 LC_ALL=en_US.UTF-8 ……

阅读全文

zsh no matches found *

机器用的shell是zsh,在用acme.sh申请Let’s Encrypt通配符证书时,报了这么个错: zsh: no matches found: *.example.com 查了一下,对.zshrc增加下面一行配置即可 setopt no_nomatch ……

阅读全文

Java 反射

万物皆对象,关于反射的一些整理。 类与对象 // Foo类 class Foo { public void sum(int a, int b) { System.out.println(a + b); } } // Foo类的一个实例对象foo Foo foo = new Foo(); 万物皆对象,类也是个对象。foo是Foo的实例对象,那么Foo又是谁的实例对象呢? 是java.lang.Class的对象。任何一个类都是其对象。 那么,怎么表示这个类的实例对象呢? // 1. 第一种表示方式 -> 任何一个类都有一个叫class的静态成员变量 Class c1 = Foo.class; // 2. 第二种表示方式 -> 通过该类的实例对象拿到 Class c2 = foo.getClass; // 3. 第三种表示方式 Class c3 = Class.forName("com.xu42.java.Foo"); 一种通过类的类类型创建类的实例对象的方式 // 可以通过类的类类型(class type)来创建类的实例对象 Foo foo = (Foo) c1.newInstance();//需要Foo拥有无参数的构造方法 java.lang.Class常用的一些方法 // 获取foo实例的public方法(包含父类) Method[] methods = c2.……

阅读全文