41 Star 100 Fork 128

openGauss/openGauss-connector-jdbc

 / 详情

字符集变量非线程安全导致多字符集环境下的JDBC产生乱码

已验收
缺陷
创建于  
2023-04-28 16:28

【标题描述】: org.postgresql.core.v3.ConnectionFactoryImpl#CLIENT_ENCODING 字符集变量非线程安全导致多字符集数据库连接并发导致数据乱码
【测试类型:接口功能】
【测试版本:MASTER】
问题描述:
org.postgresql.core.v3.ConnectionFactoryImpl#CLIENT_ENCODING 字符集变量非线程安全导致多字符集数据库连接并发导致数据乱码

【原因分析】:

  1. 这个问题的根因: org.postgresql.core.v3.ConnectionFactoryImpl#CLIENT_ENCODING 非线程安全

评论 (6)

萨西摩尔 创建了缺陷 2年前
opengauss-bot 添加了
 
sig/connectors
标签
2年前
萨西摩尔 任务状态待办的 修改为已确认 2年前
萨西摩尔 任务状态已确认 修改为修复中 2年前
jiexiao1413 负责人设置为周斌 2年前
jiexiao1413 关联项目设置为openGauss 5.1.0 community 2年前
周斌 任务状态修复中 修改为已完成 2年前

优化前版本:compiled at 2023-02-23-00:44:15 build 803aed5
优化后版本:compiled at 2023-09-13-09:44:22 build 5ec362a

验收结论:通过
优化前:
输入图片说明
输入图片说明
优化后:
输入图片说明
输入图片说明

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.opengauss.Driver;

public class JDBC_Connection_Case0001 {
	public static void main(String[] args) throws SQLException {
		System.out.println(Driver.getGSVersion());
		if (args.length < 4) {
			System.out.print("need para: host:ip,db_b,user,password");
			return;
		}
		String url1 = "jdbc:opengauss://" + args[0] + "/" + args[1]
				+ "?loggerLevel=off&allowEncodingChanges=true&characterEncoding=" + args[4];
		String url2 = "jdbc:opengauss://" + args[0] + "/" + args[1]
				+ "?LoggerLevel=off&allowEncodingChanges=true&characterEncoding=" + args[5];
		String t_name1 = "t_jdbc_connection_01_1";
		String t_name2 = "t_jdbc_connection_01_2";
		String create_sql1 = "drop table if exists " + t_name1 + "; create table " + t_name1
				+ "(id varchar(1000), name text);";
		String create_sql2 = "drop table if exists " + t_name2 + "; create table " + t_name2
				+ "(id varchar(1000), name text);";

		System.out.println("----新建连接1----");
		Connection conn1 = GetConnection(args[2], args[3], url1);
		Statement statement1 = conn1.createStatement();

		System.out.println("----连接1插入数据----");
		statement1.executeUpdate(create_sql1);
		String sql1 = "insert into " + t_name1 + "(id,name) values (?,?)";
		PreparedStatement preparedStatement = conn1.prepareStatement(sql1);
		preparedStatement.setString(1, "只有一个connection1,connection1再次插入数据");
		preparedStatement.setString(2, "%%¥¥##");
		preparedStatement.execute();

		System.out.println("----新建连接2----");
		Connection conn2 = GetConnection(args[2], args[3], url2);
		Statement statement2 = conn2.createStatement();

		System.out.println("----连接1再次插入数据----");
		preparedStatement = conn1.prepareStatement(sql1);
		preparedStatement.setString(1, "新建connection2后,connection1再次插入数据");
		preparedStatement.setString(2, "%%¥¥##");
		preparedStatement.execute();

		System.out.println("----连接1查询数据----");
		String select_sql1 = "select * from " + t_name1;
		try (ResultSet resultSet = statement1.executeQuery(select_sql1)) {
			while (resultSet.next()) {
				System.out.print("connection1: col1 = " + resultSet.getObject(1).toString());
				System.out.println("      connection1: col2 = " + resultSet.getObject(2));
			}
		}

		System.out.println("----连接2插入数据,查询数据----");
		statement2.executeUpdate(create_sql2);
		String sql2 = "insert into " + t_name2 + "(id,name) values (?,?)";
		preparedStatement = conn2.prepareStatement(sql2);
		preparedStatement.setString(1, "连接2插入数据");
		preparedStatement.setString(2, "……99*%#%");
		preparedStatement.execute();
		String select_sql2 = "select * from " + t_name2;
		try (ResultSet resultSet = statement2.executeQuery(select_sql2)) {
			while (resultSet.next()) {
				System.out.print("connection2: col1 = " + resultSet.getObject(1).toString());
				System.out.println("      connection2: col2 = " + resultSet.getObject(2));
			}
		}

		System.out.println("----删除表----");
		String drop_sql = "drop table if exists " + t_name1 + "drop table if exists " + t_name2;
		statement2.executeUpdate(drop_sql);

		statement1.close();
		statement2.close();
		conn1.close();
		conn2.close();

	}

	public static Connection GetConnection(String username, String passwd, String sourceURL) {
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(sourceURL, username, passwd);
			System.out.println(sourceURL);
			System.out.println("Connection succeed");
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return conn;
	}
}

验收日期:2023-10-19
验收版本:compiled at 2023-10-19-10:19:59 build 6061008
验收结论:通过
输入图片说明
输入图片说明

裴琳倩 任务状态已完成 修改为待回归 4个月前
裴琳倩 任务状态待回归 修改为测试中 4个月前
裴琳倩 任务状态测试中 修改为已验收 4个月前

登录 后才可以发表评论

状态
负责人
项目
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
预计工期 (小时)
开始日期   -   截止日期
-
置顶选项
优先级
预警问题
是否回合
回合版本
回合自检情况
未设置
确定
提单组织
客户名称
里程碑
分支
组织
组织
确定
故障现象
问题故障现象
确定
用例发现
备注
未设置
确定
开发领域
开发改进-改进措施
开发改进-改进措施
确定
开发改进-输出件归档
开发改进-输出件归档
确定
故障概率
开发是否复现
测试领域
测试责任人
测试责任人
子特性
问题归属自特性
确定
问题详情
问题原因详情
确定
需求引入问题
是填需求ISSUE ID;其他填否
确定
转测后遗漏问题
是否分析
关键日志
问题定位关键日志
确定
问题引入阶段
问题出现阶段
问题引入版本
测试是否复现
问题发生分类
测试改进-改进措施
测试改进措施
确定
测试改进-输出件归档
测试改进输出件归档
确定
参与者(3)
5622128 opengauss bot 1581905080 裴琳倩-peilinqian 萨西摩尔-saxisuer
Java
1
https://gitee.com/opengauss/openGauss-connector-jdbc.git
git@gitee.com:opengauss/openGauss-connector-jdbc.git
opengauss
openGauss-connector-jdbc
openGauss-connector-jdbc

搜索帮助