如何在ShardingSphere-JDBC中重构加密接口实现批量加密?
现有接口限制
当前ShardingSphere的EncryptAlgorithm和QueryAssistedEncryptAlgorithm接口仅提供单值加密/解密方法,无法高效处理批量数据场景:
public String encrypt(Object o) public Object decrypt(String s)
单条循环处理的方式在批量数据量较大时会带来明显性能损耗,需要扩展接口添加批量处理能力。
重构方案:新增批量加密解密方法
接口定义调整
在两个加密接口中新增批量处理方法,同时通过默认方法保证对现有实现的兼容性:
// 扩展EncryptAlgorithm接口 public interface EncryptAlgorithm { // 原有单值加密方法 String encrypt(Object o); // 原有单值解密方法 Object decrypt(String s); // 新增批量加密默认方法 default List<String> encrypt(List<String> encryptList) { return encryptList.stream() .map(this::encrypt) .collect(Collectors.toList()); } // 新增批量解密默认方法 default List<Object> decrypt(List<String> decryptList) { return decryptList.stream() .map(this::decrypt) .collect(Collectors.toList()); } }
注:
QueryAssistedEncryptAlgorithm接口做同样扩展即可,逻辑一致。
自定义加密算法的批量实现
现有自定义加密算法无需强制修改即可使用批量方法,但如果需要高性能批量处理,可以重写默认方法,利用加密库的批量API优化性能:
public class CustomBatchEncryptAlgorithm implements EncryptAlgorithm { // 实现原有单值加密逻辑 @Override public String encrypt(Object o) { // 单值加密具体实现,比如AES加密 return encryptSingleValue((String) o); } // 实现原有单值解密逻辑 @Override public Object decrypt(String s) { // 单值解密具体实现 return decryptSingleValue(s); } // 重写批量加密方法,实现高性能批量处理 @Override public List<String> encrypt(List<String> encryptList) { // 调用加密库的批量加密API,复用加密上下文,减少初始化开销 return batchEncryptWithCryptoLib(encryptList); } // 重写批量解密方法 @Override public List<Object> decrypt(List<String> decryptList) { // 调用加密库的批量解密API return batchDecryptWithCryptoLib(decryptList); } // 自定义批量加密逻辑 private List<String> batchEncryptWithCryptoLib(List<String> dataList) { // 具体批量加密实现,比如利用Cipher的update方法批量处理 List<String> result = new ArrayList<>(); // ... 批量加密逻辑 return result; } // 自定义批量解密逻辑 private List<Object> batchDecryptWithCryptoLib(List<String> dataList) { // 具体批量解密实现 List<Object> result = new ArrayList<>(); // ... 批量解密逻辑 return result; } }
关键注意点
- 兼容性优先:通过默认方法实现批量处理,现有加密算法无需修改即可直接使用批量能力,平滑过渡
- 性能优化:重写批量方法时,优先利用加密库的原生批量API,避免循环调用单值方法的额外开销
- 类型适配:如果业务需要处理非String类型的批量数据,可以在批量方法中添加类型转换逻辑,保证通用性
内容的提问来源于stack exchange,提问作者tian-xiaocai
相关产品推荐
相关产品推荐

