配置用户

  1. {
  2. "password": "123456",
  3. "transactionType": "proxy",
  4. "username": "root"
  5. }
  6. {
  7. "ip": "127.0.0.1",//建议为空,填写后会对客户端的ip进行限制
  8. "password": "123456",
  9. "transactionType": "proxy",
  10. "username": "root"
  11. }
  1. {
  2. "dialect":"mysql",
  3. "ip":null,
  4. "password":"123456",
  5. "transactionType":"proxy",
  6. "username":"root",
  7. "isolation":3 //2022-3-25
  8. }

{用户名}.user.json放在users文件夹下

password在密码检查在授权插件不同的情况下,Mycat2可能会获得空的密码,在mycat2不设置密码的情况下,设置空密码可以跳过检查密码

isolation

设置初始化的事务隔离级别
READ_UNCOMMITTED:1
READ_COMMITTED:2
REPEATED_READ:3,默认
SERIALIZABLE:4

transactionType

默认值:proxy
可选值:
proxy 本地事务,在涉及大于1个数据库的事务,commit阶段失败会导致不一致,但是兼容性最好
xa 事务,需要确认存储节点集群类型是否支持XA

事务类型在开启自动提交而且没有事务的时候可以使用以下语句实现切换

set transaction_policy = 'xa'

set transaction_policy = 'proxy'

SELECT @@transaction_policy
可以查询当前事务类型

无论哪种方式
应用代码编写都应该符合以下形式
连接中设置查询超时

Connection con = getConnection();
try{
start transcation;

commit/rollback;
}catche(Exception e){
rollback;//显式触发回滚
}finally{
con.close();
}

Connection con = getConnection();
try{
set autocommit = 0;

commit/rollback;
}catche(Exception e){
rollback;//显式触发回滚
}finally{
con.close();
//set autocommit = 1;//连接池隐式设置
}

encryptType

默认值:NONE
可选值:NONE,rsa

encodeKey

使用RSA的时候生效

Mycat会使用RSA和encodeKey解密出真正的密码,示例如下:

  1. {
  2. "dialect":"mysql",
  3. "ip":null,
  4. "password":"加密后的密码",
  5. "transactionType":"xa",
  6. "username":"root",
  7. "encodeKey":"秘钥",
  8. "encryptType":"rsa"
  9. }

encodeKey,和加密password的生成

  1. import java.io.UnsupportedEncodingException;
  2. import java.security.KeyFactory;
  3. import java.security.KeyPair;
  4. import java.security.KeyPairGenerator;
  5. import java.security.NoSuchAlgorithmException;
  6. import java.security.SecureRandom;
  7. import java.security.interfaces.RSAPrivateKey;
  8. import java.security.interfaces.RSAPublicKey;
  9. import java.security.spec.X509EncodedKeySpec;
  10. import java.util.Base64;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import javax.crypto.Cipher;
  14. public class RSAUtils {
  15. public static void main(String[] args) throws Exception {
  16. // 生成公钥和私钥
  17. Map<Integer, String> keyMap = genKeyPair();
  18. // 加密字符串
  19. String password = "1234567";
  20. System.out.println("随机生成的encodeKey:" + keyMap.get(1));
  21. String messageEn = encrypt(password, keyMap.get(0));
  22. System.out.println(password + "\n加密后的字符串(password)为:" + messageEn);
  23. }
  24. /**
  25. * 随机生成密钥对
  26. *
  27. * @throws NoSuchAlgorithmException
  28. */
  29. public static Map<Integer, String> genKeyPair()
  30. throws NoSuchAlgorithmException, UnsupportedEncodingException {
  31. // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
  32. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
  33. // 初始化密钥对生成器,密钥大小为96-1024位
  34. keyPairGen.initialize(1024, new SecureRandom());
  35. // 生成一个密钥对,保存在keyPair中
  36. KeyPair keyPair = keyPairGen.generateKeyPair();
  37. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥
  38. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥
  39. String publicKeyString = encodeBase64(publicKey.getEncoded());
  40. // 得到私钥字符串
  41. String privateKeyString = encodeBase64((privateKey.getEncoded()));
  42. Map<Integer, String> keyMap = new HashMap<>(); // 用于封装随机产生的公钥与私钥
  43. // 将公钥和私钥保存到Map
  44. keyMap.put(0, publicKeyString); // 0表示公钥
  45. keyMap.put(1, privateKeyString); // 1表示私钥
  46. return keyMap;
  47. }
  48. /**
  49. * RSA公钥加密
  50. *
  51. * @param str 加密字符串
  52. * @param publicKey 公钥
  53. * @return 密文
  54. * @throws Exception 加密过程中的异常信息
  55. */
  56. public static String encrypt(String str, String publicKey) throws Exception {
  57. // base64编码的公钥
  58. byte[] decoded = decodeBase64ToBytes(publicKey);
  59. RSAPublicKey pubKey =
  60. (RSAPublicKey)
  61. KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
  62. // RSA加密
  63. Cipher cipher = Cipher.getInstance("RSA");
  64. cipher.init(Cipher.ENCRYPT_MODE, pubKey);
  65. String outStr = encodeBase64(cipher.doFinal(str.getBytes("UTF-8")));
  66. return outStr;
  67. }
  68. public static String encodeBase64(byte[] data) {
  69. return encoder.encodeToString(data);
  70. }
  71. public static byte[] decodeBase64ToBytes(String data) {
  72. return decoder.decode(data.getBytes());
  73. }
  74. public static Base64.Encoder encoder;
  75. public static Base64.Decoder decoder;
  76. static {
  77. decoder = Base64.getDecoder();
  78. encoder = Base64.getEncoder();
  79. }
  80. }