codingapi / codingapi/tx-lcn

txc模式,不兼容postgresql的原因

Offen
#314 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
features/postgreSQL
Vorherrschende Sprache
Java
Sterne
4.2k
Forks
1.4k
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

我们公司用的是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,因此可能是这个报错

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne in txlcn-tc bei TxcServiceImpl.resolveInsertImage und konzentriere dich auf getGeneratedKeys(), die ResultSet-Verarbeitung und den Block DbUtils.close(resultSet). Führe einen Insert mit PostgreSQL aus und überprüfe, dass der Vorgang ohne einen ResultSet-closed-Fehler abgeschlossen wird und die Verarbeitung des generierten Schlüssels sowie das Speichern des Undo-Logs weiterhin funktionieren.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java, postgresql
Bereich
databases, distributed-systems
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.