跳至主要内容

博文

Java中使用MethodHandle的API反射

最新博文

使用sysbench对MySQL进行基准测试

Welcome file 简介 对当前硬件的MySQL进行基准测试,能够对MySQL在当前硬件下的表现有一定的了解。本文简单介绍一下如何使用sysbench对MySQL进行基准测试。 环境准备 MySQL 8.0.28 Debian 11 安装sysbench Debian/Ubuntu curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash sudo apt -y install sysbench 其他系统的安装方法可以在sysbench( https://github.com/akopytov/sysbench )的github项目主页中查看。 测试前准备 测试前,主要需要建立好对应的库和需要测试的数据 建立名为sysbench_test的库 create database sysbench_test 准备数据 sysbench oltp_read_write --table-size=10000000 --mysql-host=127.0.0.1 --db-driver=mysql --mysql-db=sysbench_test --mysql-user=root --mysql-password=root prepare table-size 表示需要准备的表的大小 后面的参数都是一些MySQL对应连接的参数 最后的prepare命令表示准备数据 开始测试 准备好数据之后,就可以开始进行基准测试了。 sysbench oltp_read_write --mysql-host=127.0.0.1 --db-driver=mysql --mysql-db=sysbench_test --mysql-user=root --mysql-password=root --table-size=10000000 --time=300 --threads=3 run time表示测试时间,单位是秒 threads表示测试的线程 测试完之后,会输出类似如下的结果(结果解释通过注释方式表示): sysbench 1.0.20 (using s

在Spring Boot中使用分布式锁

Welcome file 简介 在使用分布式锁时,经常会看到各种复制粘贴的实现,也会有很多需要注意的地方,一不小心就会出一些难以察觉的问题。还好Spring对分布式锁提供了几种方便的实现,本文简单介绍一下Redis锁的实现如何使用。 使用Redis实现分布式锁 POM文件 pom文件需要引入如下包: < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-web </ artifactId > </ dependency > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-integration </ artifactId > </ dependency > <!-- Redis --> < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-data-redis </ artifactId > </ dependency > < dependency > < groupId > org.springframework.integration </ groupId > <

使用CoreDNS加快XBOX在中国大陆的下载速度

Welcome file 简介 最近弄了个xbox series主机,在主机上下载游戏的时候,发现下载速度的随机性很大,有时候能有100Mbps左右,大部分时候在10-20Mbps之间。经过搜索,发现其实大陆是有xbox的服务器的,只是默认分配不到。也看了些方案,说是用nginx之类的web服务器拦截http请求,然后返回301或302状态,让xbox跳回带cn后缀的服务器。看了上述原理,我感觉在DNS上完成应该就行,于是在家里服务器上搭建了CoreDNS。选用CoreDNS是因为之前在k8s上用过CoreDNS,对相关配置比较熟悉,性能也不错。 安装和配置CoreDNS CoreDNS的安装十分简单,直接下载对应平台[1]的二进制包就行,也可以用Docker安装,看个人喜好。 配置只需要在安装包的当前目录下建立一个名字为 Corefile 的文件就行,最初我的配置如下: . { rewrite name substring xboxlive.com xboxlive.cn forward . /etc/resolv.conf log errors cache } 保存之后直接启动 ./coredns 。 启动之后可以使用dig命令查看是否生效(可以修改@后的地址为服务器地址): dig @127.0.0.1 www.xboxlive.com 通过查看应答,发现跟之前的不一样,而跟xboxlive.cn的返回一样,表示已部署成功并生效。 在xbox中设置dns 打开xbox的网络设置,然后在高级设置中配置对应地址就行。 测试xbox下载速度 马上去试了下载游戏,发现在浏览游戏界面时的速度变快了,但是下载速度还是在10-20Mbps之间。觉得有点奇怪,再次搜索相关的文章,发现可能是下载的游戏不是国区游戏的关系,最好是找到亚洲其他国家cdn的ip地址替换[2]。 经过测试几个cdn地址,最终的 Corefile 配置如下: . { hosts { 219.76.10.33 assets1.xboxlive.com 219.76.10.184 assets1.xboxlive.com 219.76.10.3

让Quartz Scheduler在小写表名下运行

Welcome file 简介 在使用Quartz框架时,框架内的sql语句都是使用大写的表名来操作,但是在公司内统一小写并且开启了大小写敏感的情况下,Quartz就会报错。Quartz官方也不打算提供可配置的大小写选项,只是说开启数据库大小写不敏感就可以解决[1]。在很多情况下,公司内的规范都不是个人能轻易改变的,所以比较靠谱的方法就是改Quartz框架的代码。还好框架提供了足够的扩展点,让使用者可以解决这个问题。 修改sql执行类的配置 与sql执行相关的配置有tablePrefix、driverDelegateClass和lockHandler.class,其中后两项是使用新的实现替换框架内置的实现。新的实现可以直接使用Quartz框架的,只需要把类中对应的表名大写改成小写即可,可参考基于Spring Boot的示例工程[2]。不过需要注意的是目前我只使用到了基于Cron的调度功能,所以如果有使用其他实现,需要再对示例工程做一些相应的修改。 基于Spring Boot的application配置示例: spring.datasource.url = jdbc:mysql://127.0.0.1:3306/quartz_demo spring.datasource.username = root spring.datasource.password = root spring.quartz.job-store-type = jdbc spring.quartz.properties.org.quartz.jobStore.tablePrefix = qrtz_ spring.quartz.properties.org.quartz.jobStore.driverDelegateClass = com.nereusyi.demos.quartz.StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.lockHandler.class = com.nereusyi.demos.quartz.StdRowLockSemaphore 参考资料 [1]quartz-scheduler github issues: https://g

加快Maven的构建速度

Welcome file 简介 对于CI/CD服务器,需要频繁对maven项目进行构建。我们可以基于这样的场景,使用一些技术加快maven构建速度。 使用所有cpu进行构建 默认情况下,maven只使用一个线程进行构建,但对于有多核cpu的CI/CD服务器来说,这样就有些浪费cpu资源了。这时可以通过Maven 3的并行构建来充分利用多核的性能,加速maven的构建。 构建命令: mvn -T 1C clean install 设置 -T 1C 表示每个CPU一个线程。 这对于有多个模块并且没有依赖关系的大型项目来说,能极大的加快构建速度。更详细的资料可见参考资料1。 后台运行Maven maven每次启动构建,JVM都需要重新加载相关的类,初始化相关的环境。对于CI/CD服务器来说,频繁构建就导致频繁的JVM初始化,会消耗大量时间。基于这样的场景,社区开发了maven daemon项目。 该项目的目的是让maven一直运行在后台,这样就可以免去不少maven构建时的初始化步骤。还有该项目使用了GraalVM,也就是说maven daemon是直接以本地二进制代码执行的,执行效率和内存占用相对传统JVM来说更有优势。 maven daemon使用起来也很简单,跟普通的mvn命令一样,只需要把mvn改成mvnd就可以(不同环境的安装方法,可见参考资料2的官方文档): mvnd clean install maven daemon默认就是以多线程的方式运行,所以不需要再额外设置参数。 参考资料 [1]Parallel builds in Maven 3: https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3 [2]mvn daemon: https://github.com/mvndaemon/mvnd

增强Java8和11的空指针异常提示

Welcome file 简介 在Java14之前,如果出现 NullPointerException ,只会知道有对象为null导致空指针,如果在多个对象上调用了方法,那么就很难区分到底哪个对象为null。在 Java14中,JEP 358(详情见参考资料1)的出现改善了这样的情况,丰富了 NullPointerException 的输出,但目前常用的版本还是Java8或11等长期支持的版本,所以下面介绍一种方法来让8和11也能实现更加丰富的 NullPointerException 提示。 增加空指针异常提示 示例代码如下: public static void main ( String [ ] args ) { Map < String , String > map = null ; demo ( map ) ; } public static void demo ( Map < String , String > map ) { System . out . println ( map . get ( "foo" ) . toLowerCase ( ) ) ; } 8和11在增强之前的输出如下: Exception in thread "main" java . lang . NullPointerException at com . nereusyi . npe . NpeDemo . demo ( NpeDemo . java : 18 ) at com . nereusyi . npe . NpeDemo . main ( NpeDemo . java : 14 ) 并没有什么有用的信息,根据这段异常也没法判断到底是哪个对象为null。 下面就可以开始动手增强异常提示了,我们可以在https://github.com/odnoklassniki/jvmti-tools/tree/master/richNPE中找到增强异常提示的代码,具体使用方法也在首页中有详细说明。 下载该文件之后,需要手动编译该文件,首页中少了Mac的编译命令,我在这里也补上: # Lin