codingapi / codingapi/tx-lcn

txc模式,不兼容postgresql的原因

Đang mở
#314 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
features/postgreSQL
Ngôn ngữ chính
Java
Star
4.2k
Fork
1.4k
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

我们公司用的是postgresql , 我用了txc 模式,无论换任何数据源和驱动,在插入数据的时候
都会报 ResultSet 已经关闭的错误

后来检查了lcn 的代码,发现了问题

模块: txlcn-tc
类 TxcServiceImpl

方法截图
@Override
public void resolveInsertImage(InsertImageParams insertImageParams) throws TxcLogicException {
List primaryKeys = new ArrayList<>();
FieldCluster fieldCluster = new FieldCluster();
fieldCluster.setPrimaryKeys(primaryKeys);
ResultSet resultSet = null;
try {
resultSet = insertImageParams.getStatement().getGeneratedKeys();
} catch (SQLException ignored) {
// ignored non gen key.
}
try {
for (int i = 0; i < insertImageParams.getPrimaryKeyValuesList().size(); i++) {
Map pks = insertImageParams.getPrimaryKeyValuesList().get(i);
for (String key : insertImageParams.getFullyQualifiedPrimaryKeys()) {
FieldValue fieldValue = new FieldValue();
fieldValue.setFieldName(key);
if (pks.containsKey(key)) {
fieldValue.setValue(pks.get(key));
} else if (Objects.nonNull(resultSet)) {
try {
resultSet.next();
fieldValue.setValue(resultSet.getObject(1));
} catch (SQLException ignored) {
}
}
primaryKeys.add(fieldValue);
}
}
} finally {
try {
DbUtils.close(resultSet);
} catch (SQLException ignored) {
}
}

// save to db
TableRecordList tableRecords = new TableRecordList();
tableRecords.getTableRecords().add(new TableRecord(insertImageParams.getTableName(), fieldCluster));
saveUndoLog(DTXLocalContext.cur().getGroupId(), DTXLocalContext.cur().getUnitId(), SqlUtils.SQL_TYPE_INSERT, tableRecords);
}

修改过程:
把下面这段注释了,就解决问题了
try {
DbUtils.close(resultSet);
} catch (SQLException ignored) {
}

原因: postgresql 的 metacheck ,会去检查ResultSet 的状态,mysql 则不会
以上代码close 的是 insert 上下文带来的ResultSet,因此可能是这个报错

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu trong txlcn-tc tại TxcServiceImpl.resolveInsertImage, tập trung vào getGeneratedKeys(), việc xử lý ResultSet và khối DbUtils.close(resultSet). Tái hiện một insert với PostgreSQL và xác minh rằng thao tác hoàn tất mà không gặp lỗi ResultSet-closed, đồng thời việc xử lý khóa được sinh và lưu undo-log vẫn hoạt động.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
java, postgresql
Lĩnh vực
databases, distributed-systems
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
45/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.