JetBrains 开发工具使用最新的 JBR 提高性能

JetBrains Runtime (即 JetBrains 运行时)是一个运行时环境,用于在 Windows,Mac OS X 和 Linux 上 运行 IntelliJ 平台的各种产品。JetBrains Runtime 基于 OpenJDK 项目,并进行了一些修改。这些修改包括:抗锯齿,Linux 上增强的字体渲染,HiDPI 支持,连字,一些官方版本中未提供的针对产品崩溃的修复程序以及其他小的增强功能。

目前 JetBrains 的开发工具默认使用基于 JDK11 版本的 JBR,而 JDK11 版本的 java2d 使用 OpenGL 来渲染图形基元。JDK 17 的 java2d 使用了 Metal 框架提供更好的性能,并更好地支持现代 macOS 版本和硬件。所以我们现在可以更换 JBR 版本以提高 macOS 下 JetBrains 开发工具的性能。

现在我们开始更换开发工具的 JBR

  1. 下载最新的 JBR https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr17b135.1
  2. 更改开发工具的 VM Options, Help -> Edit Custom VM Options, 增加以下参数
--illegal-access=warn
-Dsun.java2d.metal=true
--add-opens=java.desktop/java.awt.event=ALL-UNNAMED
--add-opens=java.desktop/sun.font=ALL-UNNAMED
--add-opens=java.desktop/java.awt=ALL-UNNAMED
--add-opens=java.desktop/sun.awt=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.desktop/sun.swing=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED
--add-opens=java.desktop/java.awt.peer=ALL-UNNAMED
--add-opens=java.desktop/javax.swing.text.html=ALL-UNNAMED
--add-exports=java.desktop/sun.font=ALL-UNNAMED
--add-exports=java.desktop/com.apple.eawt=ALL-UNNAMED
--add-exports=java.desktop/com.apple.laf=ALL-UNNAMED
--add-exports=java.desktop/com.apple.eawt.event=ALL-UNNAMED
  1. 安装 Choose Runtime 插件
  1. 使用 Choose Runtime 插件安装并使用最新的 JBR,Help -> Find Action,搜索 Choose Runtime 并运行

点击 … 按钮浏览并选择第一步下载的 JBR 压缩包,然后点击 Install

安装完以后开发工具会自动重启,现在可以看到已经使用了 JDK 17 版本的 JBR

Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践

Spring Data Jpa 虽然可以使用参数调整批量插入,但是仅限于主键策略不是 IDENTITY 的情况下,对于习惯了使用 IDENTITY 的 MySQL 选手来说,批量插入数据直接就悲剧了。

幸好我们还有 JdbcTemplate 这个利器,我们使用 Spring Data Jpa 的最佳实践就是使用接口继承 JpaRepository,接口里面是没法注入的,所以我们可以再定义一个 Batch 操作的接口

public interface AdminGroupPermissionBatchRepository {
    public void batchInsert(List<AdminGroupPermission> adminGroupPermissions);
}

然后我们的接口同时继承 Batch 这个接口,再单独写一个 Batch 接口的实现就好了,Spring Data Jpa 会全自动给我们搞定注入和调用的。Spring Boot 真香啊!

public class AdminGroupPermissionBatchRepositoryImpl implements AdminGroupPermissionBatchRepository {
    private final JdbcTemplate jdbcTemplate;

    public AdminGroupPermissionBatchRepositoryImpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void batchInsert(List<AdminGroupPermission> adminGroupPermissions) {
        jdbcTemplate.batchUpdate("INSERT INTO " + AdminGroupPermission.TABLE_NAME + "(adminGroupId,actionId) values(?,?)",
                new BatchPreparedStatementSetter() {
                    @Override
                    public void setValues(PreparedStatement preparedStatement, int i)
                            throws SQLException {
                        AdminGroupPermission adminGroupPermission = adminGroupPermissions.get(i);

                        preparedStatement.setInt(1, adminGroupPermission.getAdminGroupId());
                        preparedStatement.setString(2, adminGroupPermission.getActionId());
                    }

                    @Override
                    public int getBatchSize() {
                        return adminGroupPermissions.size();
                    }
                });
    }
}

Resposity 接口类如下:

@Repository
public interface AdminGroupPermissionRepository extends JpaRepository<AdminGroupPermission, Integer>, AdminGroupPermissionBatchRepository {
    public List<AdminGroupPermission> findAllByAdminGroupId(Integer id);

    @Modifying
    @Transactional
    @Query("DELETE FROM AdminGroupPermission WHERE adminGroupId = ?1")
    public void deleteAllByAdminGroupId(Integer id);
}

以上只是主要代码片段

MySQL utf8mb4 字符集

遇到的问题

有一个项目需要存储 emoji 表情。另外极少数中文在存储的时候也遇到 utf8 编码格式的数据库在储存时报错。

Rails creating schema_migrations - Mysql2::Error: Specified key was too long

问题原因

  1. mysql 里的 utf8 一个字符最多 3 字节,只支持 BMP 这部分的 unicode 编码区
  2. BMP 是从哪到哪,基本就是0000~FFFF这一区
  3. utf8mb4 则扩展到一个字符最多能有 4 字节,所以能支持更多的字符集

结论

  1. utf8mb4 兼容 utf8 且比 utf8 能表示更多的字符
  2. 至于什么时候用,看unicode编码区
  3. 从 1 – 126 就属于传统 utf8 区,当然 utf8mb4 也兼容这个区,126 行以下就是 utf8mb4 扩充区,什么时候你需要存储那些字符,你才用 utf8mb4 否则只是浪费空间
  4. 涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集
  5. utf8mb4 是 utf8 的超集

升级步骤

  1. 备份数据库
  2. 升级 MySQL Server 到 v5.5.3+ (低版本不支持这个字符集、复制报错)
  3. 修改 database、table 和 column 字符集
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Example
ALTER TABLE `table_name` MODIFY COLUMN `column_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
  • 修改 my.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
  • 重启 MySQL Server、检查字符集
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+--------------------------+--------------------+
 rows in set (0.00 sec)

如何把 emoji 编码转换为 emoji 表情

阿里云 RDS 对 utf8mb4 的支持

RDS 是支持 utf8mb4 编码的。如果在数据库管理界面修改之后,对新创建的表默认就是支持 utf8mb4 ,对已经存在表,在字段上做字符集的修改操作才可以。

禁用 Firefox 中的 Hello, Pocket, Reader View 和 WebRTC

在about:config中找到并修改为以下值:

  • loop.enabled = false //disable Firefox Hello
  • browser.pocket.enabled = false //disable Pocket plugin
  • reader.parse-on-load.enabled = false //disable Reader View
  • media.peerconnection.enabled = false //disable WebRTC

P.S. 其实有个插件也可以禁用这些功能(Hello, Pocket, Reader View),下载地址为: https://addons.mozilla.org/en-us/firefox/addon/disable-hello-pocket-reader/

WebRTC一般用不到,建议禁用。

以上插件禁用后,Firefox的内存占用会显著减小。

转载自:http://yuv.me/disable-hello-pocket-reader-view-and-webrtc-in-firefox/