From 78288227bfe8dc3f553b93d3c5b52b2483c234fb Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 20 Mar 2019 14:45:29 +0800 Subject: [PATCH 01/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0oracle=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fescar/rm/datasource/ConnectionProxy.java | 8 +- .../rm/datasource/DataSourceManager.java | 8 +- .../exec/BaseTransactionalExecutor.java | 12 +- .../rm/datasource/sql/SQLVisitorFactory.java | 18 +- .../druid/oracle/ORACLEDeleteRecognizer.java | 112 +++++++ .../druid/oracle/ORACLEInsertRecognizer.java | 117 +++++++ .../ORACLESelectForUpdateRecognizer.java | 129 ++++++++ .../druid/oracle/ORACLEUpdateRecognizer.java | 164 ++++++++++ .../sql/struct/TableMetaCacheOracle.java | 289 ++++++++++++++++++ .../undo/KeywordCheckerFactory.java | 12 +- .../datasource/undo/UndoExecutorFactory.java | 36 ++- .../datasource/undo/UndoLogManagerOracle.java | 201 ++++++++++++ .../undo/oracle/ORACLEUndoDeleteExecutor.java | 92 ++++++ .../undo/oracle/ORACLEUndoInsertExecutor.java | 79 +++++ .../undo/oracle/ORACLEUndoUpdateExecutor.java | 78 +++++ .../oracle/keyword/ORACLEKeywordChecker.java | 212 +++++++++++++ 16 files changed, 1543 insertions(+), 24 deletions(-) create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java create mode 100644 rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/ConnectionProxy.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/ConnectionProxy.java index 3289963cec6..6bce8eabaee 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/ConnectionProxy.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/ConnectionProxy.java @@ -19,6 +19,7 @@ import java.sql.Connection; import java.sql.SQLException; +import com.alibaba.druid.util.JdbcConstants; import com.alibaba.fescar.core.exception.TransactionException; import com.alibaba.fescar.core.exception.TransactionExceptionCode; import com.alibaba.fescar.core.model.BranchStatus; @@ -27,6 +28,7 @@ import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; import com.alibaba.fescar.rm.datasource.undo.UndoLogManager; +import com.alibaba.fescar.rm.datasource.undo.UndoLogManagerOracle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -177,7 +179,11 @@ private void processGlobalTransactionCommit() throws SQLException { try { if (context.hasUndoLog()) { - UndoLogManager.flushUndoLogs(this); + if(JdbcConstants.ORACLE.equalsIgnoreCase(this.getDbType())) { + UndoLogManagerOracle.flushUndoLogs(this); + } else { + UndoLogManager.flushUndoLogs(this); + } } targetConnection.commit(); } catch (Throwable ex) { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/DataSourceManager.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/DataSourceManager.java index 449ffea80e3..4dcdfb5c432 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/DataSourceManager.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/DataSourceManager.java @@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeoutException; +import com.alibaba.druid.util.JdbcConstants; import com.alibaba.fescar.common.XID; import com.alibaba.fescar.common.exception.FrameworkException; import com.alibaba.fescar.common.exception.NotSupportYetException; @@ -49,6 +50,7 @@ import com.alibaba.fescar.discovery.registry.RegistryFactory; import com.alibaba.fescar.rm.datasource.undo.UndoLogManager; +import com.alibaba.fescar.rm.datasource.undo.UndoLogManagerOracle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -245,7 +247,11 @@ public BranchStatus branchRollback(String xid, long branchId, String resourceId, throw new ShouldNeverHappenException(); } try { - UndoLogManager.undo(dataSourceProxy, xid, branchId); + if(JdbcConstants.ORACLE.equalsIgnoreCase(dataSourceProxy.getDbType())) { + UndoLogManagerOracle.undo(dataSourceProxy, xid, branchId); + } else { + UndoLogManager.undo(dataSourceProxy, xid, branchId); + } } catch (TransactionException te) { if (te.getCode() == TransactionExceptionCode.BranchRollbackFailed_Unretriable) { return BranchStatus.PhaseTwo_RollbackFailed_Unretryable; diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java index 515542871ce..72f573985b6 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java @@ -20,15 +20,13 @@ import java.sql.Statement; import java.util.List; +import com.alibaba.druid.util.JdbcConstants; import com.alibaba.fescar.core.context.RootContext; import com.alibaba.fescar.rm.datasource.ConnectionProxy; import com.alibaba.fescar.rm.datasource.StatementProxy; import com.alibaba.fescar.rm.datasource.sql.SQLRecognizer; import com.alibaba.fescar.rm.datasource.sql.SQLType; -import com.alibaba.fescar.rm.datasource.sql.struct.Field; -import com.alibaba.fescar.rm.datasource.sql.struct.TableMeta; -import com.alibaba.fescar.rm.datasource.sql.struct.TableMetaCache; -import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; +import com.alibaba.fescar.rm.datasource.sql.struct.*; import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; /** @@ -162,7 +160,11 @@ protected TableMeta getTableMeta(String tableName) { if (tableMeta != null) { return tableMeta; } - tableMeta = TableMetaCache.getTableMeta(statementProxy.getConnectionProxy().getDataSourceProxy(), tableName); + if(JdbcConstants.ORACLE.equalsIgnoreCase(statementProxy.getConnectionProxy().getDbType())) { + tableMeta = TableMetaCacheOracle.getTableMeta(statementProxy.getConnectionProxy().getDataSourceProxy(), tableName); + } else { + tableMeta = TableMetaCache.getTableMeta(statementProxy.getConnectionProxy().getDataSourceProxy(), tableName); + } return tableMeta; } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java index cef00116a34..85cb5cab5d8 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java @@ -29,6 +29,10 @@ import com.alibaba.fescar.rm.datasource.sql.druid.MySQLInsertRecognizer; import com.alibaba.fescar.rm.datasource.sql.druid.MySQLSelectForUpdateRecognizer; import com.alibaba.fescar.rm.datasource.sql.druid.MySQLUpdateRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLEDeleteRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLEInsertRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLESelectForUpdateRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLEUpdateRecognizer; /** * The type Sql visitor factory. @@ -61,7 +65,19 @@ public static SQLRecognizer get(String sql, String dbType) { recognizer = new MySQLSelectForUpdateRecognizer(sql, ast); } } - } else { + } else if (JdbcConstants.ORACLE.equalsIgnoreCase(dbType)) { + if (ast instanceof SQLInsertStatement) { + recognizer = new ORACLEInsertRecognizer(sql, ast); + } else if (ast instanceof SQLUpdateStatement) { + recognizer = new ORACLEUpdateRecognizer(sql, ast); + } else if (ast instanceof SQLDeleteStatement) { + recognizer = new ORACLEDeleteRecognizer(sql, ast); + } else if (ast instanceof SQLSelectStatement) { + if (((SQLSelectStatement) ast).getSelect().getQueryBlock().isForUpdate()) { + recognizer = new ORACLESelectForUpdateRecognizer(sql, ast); + } + } + }else { throw new UnsupportedOperationException("Just support MySQL by now!"); } return recognizer; diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java new file mode 100644 index 00000000000..76c162581a0 --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java @@ -0,0 +1,112 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.sql.druid.oracle; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; +import com.alibaba.fescar.rm.datasource.ParametersHolder; +import com.alibaba.fescar.rm.datasource.sql.SQLDeleteRecognizer; +import com.alibaba.fescar.rm.datasource.sql.SQLType; +import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; + +import java.util.ArrayList; + +/** + * The type My sql delete recognizer. + */ +public class ORACLEDeleteRecognizer extends BaseRecognizer implements SQLDeleteRecognizer { + + private final OracleDeleteStatement ast; + + /** + * Instantiates a new My sql delete recognizer. + * + * @param originalSQL the original sql + * @param ast the ast + */ + public ORACLEDeleteRecognizer(String originalSQL, SQLStatement ast) { + super(originalSQL); + this.ast = (OracleDeleteStatement) ast; + } + + @Override + public SQLType getSQLType() { + return SQLType.DELETE; + } + + @Override + public String getTableAlias() { + return ast.getTableSource().getAlias(); + } + + @Override + public String getTableName() { + StringBuffer sb = new StringBuffer(); + OracleOutputVisitor visitor = new OracleOutputVisitor(sb) { + + @Override + public boolean visit(SQLExprTableSource x) { + printTableSourceExpr(x.getExpr()); + return false; + } + }; + visitor.visit((SQLExprTableSource)ast.getTableSource()); + return sb.toString(); + } + + @Override + public String getWhereCondition(final ParametersHolder parametersHolder, final ArrayList paramAppender) { + SQLExpr where = ast.getWhere(); + if (where == null) { + return ""; + } + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb) { + + @Override + public boolean visit(SQLVariantRefExpr x) { + if ("?".equals(x.getName())) { + ArrayList params = parametersHolder.getParameters()[x.getIndex()]; + paramAppender.add(params.get(0)); + } + return super.visit(x); + } + }; + visitor.visit((SQLBinaryOpExpr) where); + return sb.toString(); + } + + @Override + public String getWhereCondition() { + SQLExpr where = ast.getWhere(); + if (where == null) { + return ""; + } + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb); + visitor.visit((SQLBinaryOpExpr) where); + return sb.toString(); + } + +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java new file mode 100644 index 00000000000..cf2d740ffd0 --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java @@ -0,0 +1,117 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.sql.druid.oracle; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLValuableExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; +import com.alibaba.fescar.rm.datasource.sql.SQLInsertRecognizer; +import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; +import com.alibaba.fescar.rm.datasource.sql.SQLType; +import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; + +import java.util.ArrayList; +import java.util.List; + +/** + * The type My sql insert recognizer. + */ +public class ORACLEInsertRecognizer extends BaseRecognizer implements SQLInsertRecognizer { + + private final OracleInsertStatement ast; + + /** + * Instantiates a new My sql insert recognizer. + * + * @param originalSQL the original sql + * @param ast the ast + */ + public ORACLEInsertRecognizer(String originalSQL, SQLStatement ast) { + super(originalSQL); + this.ast = (OracleInsertStatement) ast; + } + + @Override + public SQLType getSQLType() { + return SQLType.INSERT; + } + + @Override + public String getTableAlias() { + return ast.getTableSource().getAlias(); + } + + @Override + public String getTableName() { + StringBuffer sb = new StringBuffer(); + OracleOutputVisitor visitor = new OracleOutputVisitor(sb) { + + @Override + public boolean visit(SQLExprTableSource x) { + printTableSourceExpr(x.getExpr()); + return false; + } + }; + visitor.visit(ast.getTableSource()); + return sb.toString(); + } + + @Override + public List getInsertColumns() { + List columnSQLExprs = ast.getColumns(); + if (columnSQLExprs.size() == 0) { + // INSERT INTO ta VALUES (...), without fields clarified + return null; + } + List list = new ArrayList<>(columnSQLExprs.size()); + for (SQLExpr expr : columnSQLExprs) { + if (expr instanceof SQLIdentifierExpr) { + list.add(((SQLIdentifierExpr)expr).getName().toUpperCase()); + } else { + throw new SQLParsingException("Unknown SQLExpr: " + expr.getClass() + " " + expr); + } + } + return list; + } + + @Override + public List> getInsertRows() { + List valuesClauses = ast.getValuesList(); + List> rows = new ArrayList<>(valuesClauses.size()); + for (SQLInsertStatement.ValuesClause valuesClause : valuesClauses) { + List exprs = valuesClause.getValues(); + List row = new ArrayList<>(exprs.size()); + rows.add(row); + for (SQLExpr expr : valuesClause.getValues()) { + if (expr instanceof SQLValuableExpr) { + row.add(((SQLValuableExpr)expr).getValue()); + } else { + throw new SQLParsingException("Unknown SQLExpr: " + expr.getClass() + " " + expr); + } + } + } + return rows; + } +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java new file mode 100644 index 00000000000..77eee992ae3 --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java @@ -0,0 +1,129 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.sql.druid.oracle; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.*; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; +import com.alibaba.fescar.rm.datasource.ParametersHolder; +import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; +import com.alibaba.fescar.rm.datasource.sql.SQLSelectRecognizer; +import com.alibaba.fescar.rm.datasource.sql.SQLType; +import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; + +import java.util.ArrayList; + +/** + * The type My sql select for update recognizer. + */ + +public class ORACLESelectForUpdateRecognizer extends BaseRecognizer implements SQLSelectRecognizer { + + private final SQLSelectStatement ast; + + /** + * Instantiates a new My sql select for update recognizer. + * + * @param originalSQL the original sql + * @param ast the ast + */ + public ORACLESelectForUpdateRecognizer(String originalSQL, SQLStatement ast) { + super(originalSQL); + this.ast = (SQLSelectStatement) ast; + } + + @Override + public SQLType getSQLType() { + return SQLType.SELECT_FOR_UPDATE; + } + + @Override + public String getWhereCondition(final ParametersHolder parametersHolder, final ArrayList paramAppender) { + SQLSelectQueryBlock selectQueryBlock = getSelect(); + SQLExpr where = selectQueryBlock.getWhere(); + if (where == null) { + return ""; + } + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb) { + + @Override + public boolean visit(SQLVariantRefExpr x) { + if ("?".equals(x.getName())) { + ArrayList params = parametersHolder.getParameters()[x.getIndex()]; + paramAppender.add(params.get(0)); + } + return super.visit(x); + } + }; + visitor.visit((SQLBinaryOpExpr) where); + return sb.toString(); + } + + @Override + public String getWhereCondition() { + SQLSelectQueryBlock selectQueryBlock = getSelect(); + SQLExpr where = selectQueryBlock.getWhere(); + if (where == null) { + return ""; + } + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb); + visitor.visit((SQLBinaryOpExpr) where); + return sb.toString(); + } + + private SQLSelectQueryBlock getSelect() { + SQLSelect select = ast.getSelect(); + if (select == null) { + throw new SQLParsingException("should never happen!"); + } + SQLSelectQueryBlock selectQueryBlock = select.getQueryBlock(); + if (selectQueryBlock == null) { + throw new SQLParsingException("should never happen!"); + } + return selectQueryBlock; + } + + @Override + public String getTableAlias() { + SQLSelectQueryBlock selectQueryBlock = getSelect(); + SQLTableSource tableSource = selectQueryBlock.getFrom(); + return tableSource.getAlias(); + } + + @Override + public String getTableName() { + SQLSelectQueryBlock selectQueryBlock = getSelect(); + SQLTableSource tableSource = selectQueryBlock.getFrom(); + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb) { + + @Override + public boolean visit(SQLExprTableSource x) { + printTableSourceExpr(x.getExpr()); + return false; + } + }; + visitor.visit((SQLExprTableSource)tableSource); + return sb.toString(); + } + +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java new file mode 100644 index 00000000000..4e76c7e810c --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java @@ -0,0 +1,164 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.sql.druid.oracle; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.*; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; +import com.alibaba.fescar.rm.datasource.ParametersHolder; +import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; +import com.alibaba.fescar.rm.datasource.sql.SQLType; +import com.alibaba.fescar.rm.datasource.sql.SQLUpdateRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; + +import java.util.ArrayList; +import java.util.List; + +/** + * The type My sql update recognizer. + */ +public class ORACLEUpdateRecognizer extends BaseRecognizer implements SQLUpdateRecognizer { + + private OracleUpdateStatement ast; + + /** + * Instantiates a new My sql update recognizer. + * + * @param originalSQL the original sql + * @param ast the ast + */ + public ORACLEUpdateRecognizer(String originalSQL, SQLStatement ast) { + super(originalSQL); + this.ast = (OracleUpdateStatement) ast; + } + + @Override + public SQLType getSQLType() { + return SQLType.UPDATE; + } + + @Override + public List getUpdateColumns() { + List updateSetItems = ast.getItems(); + List list = new ArrayList<>(updateSetItems.size()); + for (SQLUpdateSetItem updateSetItem : updateSetItems) { + SQLExpr expr = updateSetItem.getColumn(); + if (expr instanceof SQLIdentifierExpr) { + list.add(((SQLIdentifierExpr) expr).getName().toUpperCase()); + } else if (expr instanceof SQLPropertyExpr){ + // This is alias case, like UPDATE xxx_tbl a SET a.name = ? WHERE a.id = ? + SQLExpr owner = ((SQLPropertyExpr) expr).getOwner(); + if (owner instanceof SQLIdentifierExpr) { + list.add((((SQLIdentifierExpr)owner).getName() + "." + ((SQLPropertyExpr) expr).getName())); + } + } else { + throw new SQLParsingException("Unknown SQLExpr: " + expr.getClass() + " " + expr); + } + } + return list; + } + + @Override + public List getUpdateValues() { + List updateSetItems = ast.getItems(); + List list = new ArrayList<>(updateSetItems.size()); + for (SQLUpdateSetItem updateSetItem : updateSetItems) { + SQLExpr expr = updateSetItem.getValue(); + if (expr instanceof SQLValuableExpr) { + list.add(((SQLValuableExpr) expr).getValue()); + } else if (expr instanceof SQLVariantRefExpr) { + list.add(new VMarker()); + } else { + throw new SQLParsingException("Unknown SQLExpr: " + expr.getClass() + " " + expr); + } + } + return list; + } + + @Override + public String getWhereCondition(final ParametersHolder parametersHolder, final ArrayList paramAppender) { + SQLExpr where = ast.getWhere(); + if (where == null) { + return ""; + } + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb) { + + @Override + public boolean visit(SQLVariantRefExpr x) { + if ("?".equals(x.getName())) { + ArrayList params = parametersHolder.getParameters()[x.getIndex()]; + paramAppender.add(params.get(0)); + } + return super.visit(x); + } + }; + visitor.visit((SQLBinaryOpExpr) where); + return sb.toString(); + } + + @Override + public String getWhereCondition() { + SQLExpr where = ast.getWhere(); + if (where == null) { + return ""; + } + + + StringBuffer sb = new StringBuffer(); + MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb); + + if(where instanceof SQLBetweenExpr){ + visitor.visit((SQLBetweenExpr) where); + }else if(where instanceof SQLInListExpr){ + visitor.visit((SQLInListExpr) where); + }else{ + visitor.visit((SQLBinaryOpExpr) where); + } + + return sb.toString(); + } + + @Override + public String getTableAlias() { + return ast.getTableSource().getAlias(); + } + + @Override + public String getTableName() { + StringBuffer sb = new StringBuffer(); + OracleOutputVisitor visitor = new OracleOutputVisitor(sb) { + + @Override + public boolean visit(SQLExprTableSource x) { + printTableSourceExpr(x.getExpr()); + return false; + } + }; + SQLExprTableSource tableSource = (SQLExprTableSource) ast.getTableSource(); + visitor.visit(tableSource); + return sb.toString(); + } + +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java new file mode 100644 index 00000000000..d01a5942b16 --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java @@ -0,0 +1,289 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.sql.struct; + +import java.sql.*; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.StringUtils; +import com.alibaba.fescar.common.exception.ShouldNeverHappenException; +import com.alibaba.fescar.core.context.RootContext; +import com.alibaba.fescar.rm.datasource.AbstractConnectionProxy; +import com.alibaba.fescar.rm.datasource.DataSourceProxy; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +/** + * The type Table meta cache. + */ +public class TableMetaCacheOracle { + + private static final long CACHE_SIZE = 100000; + + private static final long EXPIRE_TIME = 900 * 1000; + + private static final Cache TABLE_META_CACHE = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE) + .expireAfterWrite(EXPIRE_TIME, TimeUnit.MILLISECONDS).softValues().build(); + + /** + * Gets table meta. + * + * @param dataSourceProxy the data source proxy + * @param tableName the table name + * @return the table meta + */ + public static TableMeta getTableMeta(DataSourceProxy dataSourceProxy, String tableName) { + return getTableMeta(dataSourceProxy.getTargetDataSource(), tableName); + } + + /** + * Gets table meta. + * + * @param druidDataSource the druid data source + * @param tableName the table name + * @return the table meta + */ + public static TableMeta getTableMeta(final DruidDataSource druidDataSource, final String tableName) { + if (StringUtils.isEmpty(tableName)) { + throw new IllegalArgumentException("TableMeta cannot be fetched without tableName"); + } + + String dataSourceKey = druidDataSource.getUrl(); + + TableMeta tmeta = null; + final String key = dataSourceKey + "." + tableName; + try { + tmeta = TABLE_META_CACHE.get(key, new Callable() { + @Override + public TableMeta call() throws Exception { + return fetchSchema(druidDataSource, tableName); + } + }); + } catch (ExecutionException e) { + } + + if (tmeta == null) { + try { + tmeta = fetchSchema(druidDataSource, tableName); + } catch (SQLException e) { + } + } + + if (tmeta == null) { + throw new ShouldNeverHappenException(String.format("[xid:%s]get tablemeta failed", RootContext.getXID())); + } + return tmeta; + } + + private static TableMeta fetchSchema(DruidDataSource druidDataSource, String tableName) throws SQLException { + return fetchSchemeInDefaultWay(druidDataSource, tableName); + } + + private static TableMeta fetchSchemeInDefaultWay(DruidDataSource druidDataSource, String tableName) + throws SQLException { + Connection conn = null; + java.sql.Statement stmt = null; + java.sql.ResultSet rs = null; + try { + conn = druidDataSource.getConnection(); + stmt = conn.createStatement(); + StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName ); + rs = stmt.executeQuery(sb.toString()); + ResultSetMetaData rsmd = rs.getMetaData(); + DatabaseMetaData dbmd = conn.getMetaData(); + + return resultSetMetaToSchema(rsmd, dbmd, tableName); + } catch (Exception e) { + if (e instanceof SQLException) { + throw ((SQLException)e); + } + throw new SQLException("Failed to fetch schema of " + tableName, e); + + } finally { + if (rs != null) { + rs.close(); + } + if (stmt != null) { + stmt.close(); + } + if (conn != null) { + conn.close(); + } + } + } + + private static TableMeta resultSetMetaToSchema(java.sql.ResultSet rs2, AbstractConnectionProxy conn, + String tablename) throws SQLException { + String tableName = tablename; + + TableMeta tm = new TableMeta(); + tm.setTableName(tableName); + while (rs2.next()) { + ColumnMeta col = new ColumnMeta(); + col.setTableName(tableName); + col.setColumnName(rs2.getString("COLUMN_NAME")); + String datatype = rs2.getString("DATA_TYPE"); + if (StringUtils.equalsIgnoreCase(datatype, "NUMBER")) { + col.setDataType(java.sql.Types.BIGINT); + } else if (StringUtils.equalsIgnoreCase(datatype, "VARCHAR2")) { + col.setDataType(java.sql.Types.VARCHAR); + } else if (StringUtils.equalsIgnoreCase(datatype, "CHAR")) { + col.setDataType(java.sql.Types.CHAR); + } else if (StringUtils.equalsIgnoreCase(datatype, "DATE")) { + col.setDataType(java.sql.Types.DATE); + } + + col.setColumnSize(rs2.getInt("DATA_LENGTH")); + + tm.getAllColumns().put(col.getColumnName(), col); + } + + java.sql.Statement stmt = null; + java.sql.ResultSet rs1 = null; + try { + stmt = conn.getTargetConnection().createStatement(); + rs1 = stmt.executeQuery( + "select a.constraint_name, a.column_name from user_cons_columns a, user_constraints b where a" + + ".constraint_name = b.constraint_name and b.constraint_type = 'P' and a.table_name ='" + + tableName + "'"); + while (rs1.next()) { + String indexName = rs1.getString(1); + String colName = rs1.getString(2); + ColumnMeta col = tm.getAllColumns().get(colName); + + if (tm.getAllIndexes().containsKey(indexName)) { + IndexMeta index = tm.getAllIndexes().get(indexName); + index.getValues().add(col); + } else { + IndexMeta index = new IndexMeta(); + index.setIndexName(indexName); + index.getValues().add(col); + index.setIndextype(IndexType.PRIMARY); + tm.getAllIndexes().put(indexName, index); + + } + } + } finally { + if (rs1 != null) { + rs1.close(); + } + if (stmt != null) { + stmt.close(); + } + } + + return tm; + } + + private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseMetaData dbmd, String tableName) + throws SQLException { +// String schemaName = rsmd.getSchemaName(1); +// String catalogName = rsmd.getCatalogName(1); + + TableMeta tm = new TableMeta(); + tm.setTableName(tableName); + + ResultSet rs1 = dbmd.getColumns("", dbmd.getUserName(), tableName, "%"); + while (rs1.next()) { + ColumnMeta col = new ColumnMeta(); + col.setTableCat(rs1.getString("TABLE_CAT")); + col.setTableSchemaName(rs1.getString("TABLE_SCHEM")); + col.setTableName(rs1.getString("TABLE_NAME")); + col.setColumnName(rs1.getString("COLUMN_NAME")); + col.setDataType(rs1.getInt("DATA_TYPE")); + col.setDataTypeName(rs1.getString("TYPE_NAME")); + col.setColumnSize(rs1.getInt("COLUMN_SIZE")); + col.setDecimalDigits(rs1.getInt("DECIMAL_DIGITS")); + col.setNumPrecRadix(rs1.getInt("NUM_PREC_RADIX")); + col.setNullAble(rs1.getInt("NULLABLE")); + col.setRemarks(rs1.getString("REMARKS")); + col.setColumnDef(rs1.getString("COLUMN_DEF")); + col.setSqlDataType(rs1.getInt("SQL_DATA_TYPE")); + col.setSqlDatetimeSub(rs1.getInt("SQL_DATETIME_SUB")); + col.setCharOctetLength(rs1.getInt("CHAR_OCTET_LENGTH")); + col.setOrdinalPosition(rs1.getInt("ORDINAL_POSITION")); + col.setIsNullAble(rs1.getString("IS_NULLABLE")); +// col.setIsAutoincrement(rs1.getString("IS_AUTOINCREMENT")); + + tm.getAllColumns().put(col.getColumnName(), col); + } + + + java.sql.ResultSet rs2 = dbmd.getIndexInfo(null, dbmd.getUserName(), tableName, false, true); + + String indexName = ""; + while (rs2.next()) { + indexName = rs2.getString("INDEX_NAME"); + if( org.apache.commons.lang3.StringUtils.isEmpty(indexName) ){ + continue; + } + String colName = rs2.getString("COLUMN_NAME").toUpperCase(); + ColumnMeta col = tm.getAllColumns().get(colName); + + if (tm.getAllIndexes().containsKey(indexName)) { + IndexMeta index = tm.getAllIndexes().get(indexName); + index.getValues().add(col); + } else { + IndexMeta index = new IndexMeta(); + index.setIndexName(indexName); + index.setNonUnique(rs2.getBoolean("NON_UNIQUE")); + index.setIndexQualifier(rs2.getString("INDEX_QUALIFIER")); + index.setIndexName(rs2.getString("INDEX_NAME")); + index.setType(rs2.getShort("TYPE")); + index.setOrdinalPosition(rs2.getShort("ORDINAL_POSITION")); + index.setAscOrDesc(rs2.getString("ASC_OR_DESC")); + index.setCardinality(rs2.getInt("CARDINALITY")); + index.getValues().add(col); + if ("PRIMARY".equalsIgnoreCase(indexName) || ( + tableName+ "_pkey").equalsIgnoreCase(indexName)) { + index.setIndextype(IndexType.PRIMARY); + } else if (index.isNonUnique() == false) { + index.setIndextype(IndexType.Unique); + } else { + index.setIndextype(IndexType.Normal); + } + tm.getAllIndexes().put(indexName, index); + + } + } + ResultSet pk = dbmd.getPrimaryKeys(null, dbmd.getUserName(), tableName); + while (pk.next()) { + String pkIndexName = pk.getObject(6).toString(); + if (tm.getAllIndexes().containsKey(pkIndexName)) { + IndexMeta index = tm.getAllIndexes().get(pkIndexName); + index.setIndextype(IndexType.PRIMARY); + } + } + IndexMeta index = tm.getAllIndexes().get(indexName); + if (index.getIndextype().value() != 0) { + if ("H2 JDBC Driver".equals(dbmd.getDriverName())) { + if (indexName.length() > 11 && "PRIMARY_KEY".equalsIgnoreCase(indexName.substring(0, 11))) { + index.setIndextype(IndexType.PRIMARY); + } + } else if (dbmd.getDriverName() != null && dbmd.getDriverName().toLowerCase().indexOf("postgresql") >= 0) { + if ((tableName + "_pkey").equalsIgnoreCase(indexName)) { + index.setIndextype(IndexType.PRIMARY); + } + } + } + return tm; + } +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java index 80720ab7bf9..5c71f3cd89e 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java @@ -19,24 +19,26 @@ import com.alibaba.druid.util.JdbcConstants; import com.alibaba.fescar.common.exception.NotSupportYetException; import com.alibaba.fescar.rm.datasource.undo.mysql.keyword.MySQLKeywordChecker; +import com.alibaba.fescar.rm.datasource.undo.oracle.keyword.ORACLEKeywordChecker; /** - * The type Keyword checker factory. - * * @author Wu - * @date 2019 /3/5 The Type keyword checker factory + * @date 2019/3/5 + * The Type keyword checker factory */ public class KeywordCheckerFactory { /** * get keyword checker * - * @param dbType the db type - * @return keyword checker + * @param dbType + * @return */ public static KeywordChecker getKeywordChecker(String dbType) { if (dbType.equals(JdbcConstants.MYSQL)) { return MySQLKeywordChecker.getInstance(); + } else if (dbType.equals(JdbcConstants.ORACLE)) { + return ORACLEKeywordChecker.getInstance(); } else { throw new NotSupportYetException(dbType); } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java index 6e8daaf9e0a..0706ddad65e 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java @@ -22,6 +22,7 @@ import com.alibaba.fescar.rm.datasource.undo.mysql.MySQLUndoDeleteExecutor; import com.alibaba.fescar.rm.datasource.undo.mysql.MySQLUndoInsertExecutor; import com.alibaba.fescar.rm.datasource.undo.mysql.MySQLUndoUpdateExecutor; +import com.alibaba.fescar.rm.datasource.undo.oracle.ORACLEUndoInsertExecutor; /** * The type Undo executor factory. @@ -36,18 +37,31 @@ public class UndoExecutorFactory { * @return the undo executor */ public static AbstractUndoExecutor getUndoExecutor(String dbType, SQLUndoLog sqlUndoLog) { - if (!dbType.equals(JdbcConstants.MYSQL)) { + if (!dbType.equalsIgnoreCase(JdbcConstants.MYSQL)&&!dbType.equalsIgnoreCase(JdbcConstants.ORACLE)) { throw new NotSupportYetException(dbType); } - switch (sqlUndoLog.getSqlType()) { - case INSERT: - return new MySQLUndoInsertExecutor(sqlUndoLog); - case UPDATE: - return new MySQLUndoUpdateExecutor(sqlUndoLog); - case DELETE: - return new MySQLUndoDeleteExecutor(sqlUndoLog); - default: - throw new ShouldNeverHappenException(); - } + if(dbType.equalsIgnoreCase(JdbcConstants.ORACLE)) { + switch (sqlUndoLog.getSqlType()) { + case INSERT: + return new ORACLEUndoInsertExecutor(sqlUndoLog); + case UPDATE: + return new ORACLEUndoInsertExecutor(sqlUndoLog); + case DELETE: + return new ORACLEUndoInsertExecutor(sqlUndoLog); + default: + throw new ShouldNeverHappenException(); + } + } else { + switch (sqlUndoLog.getSqlType()) { + case INSERT: + return new MySQLUndoInsertExecutor(sqlUndoLog); + case UPDATE: + return new MySQLUndoUpdateExecutor(sqlUndoLog); + case DELETE: + return new MySQLUndoDeleteExecutor(sqlUndoLog); + default: + throw new ShouldNeverHappenException(); + } + } } } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java new file mode 100644 index 00000000000..3ee84431e9f --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java @@ -0,0 +1,201 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.undo; + +import java.io.ByteArrayInputStream; +import java.sql.Blob; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fescar.common.exception.NotSupportYetException; +import com.alibaba.fescar.common.util.BlobUtils; +import com.alibaba.fescar.common.util.StringUtils; +import com.alibaba.fescar.core.exception.TransactionException; +import com.alibaba.fescar.rm.datasource.ConnectionContext; +import com.alibaba.fescar.rm.datasource.ConnectionProxy; +import com.alibaba.fescar.rm.datasource.DataSourceProxy; +import com.alibaba.fescar.rm.datasource.sql.struct.TableMeta; + +import com.alibaba.fescar.rm.datasource.sql.struct.TableMetaCacheOracle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static com.alibaba.fescar.core.exception.TransactionExceptionCode.BranchRollbackFailed_Retriable; + +/** + * The type Undo log manager. + */ +public final class UndoLogManagerOracle { + + private static final Logger LOGGER = LoggerFactory.getLogger(UndoLogManager.class); + + private static String UNDO_LOG_TABLE_NAME = "undo_log"; + private static String INSERT_UNDO_LOG_SQL = "INSERT INTO " + UNDO_LOG_TABLE_NAME + "\n" + + "\t(id,branch_id, xid, rollback_info, log_status, log_created, log_modified)\n" + + "VALUES (UNDO_LOG_SEQ.nextval,?, ?, ?, 0, sysdate, sysdate)"; + private static String DELETE_UNDO_LOG_SQL = "DELETE FROM " + UNDO_LOG_TABLE_NAME + "\n" + + "\tWHERE branch_id = ? AND xid = ?"; + + private static String SELECT_UNDO_LOG_SQL = "SELECT * FROM " + UNDO_LOG_TABLE_NAME + + " WHERE log_status = 0 AND branch_id = ? AND xid = ? FOR UPDATE"; + + private UndoLogManagerOracle() { + + } + + /** + * Flush undo logs. + * + * @param cp the cp + * @throws SQLException the sql exception + */ + public static void flushUndoLogs(ConnectionProxy cp) throws SQLException { + assertDbSupport(cp.getDbType()); + + ConnectionContext connectionContext = cp.getContext(); + String xid = connectionContext.getXid(); + long branchID = connectionContext.getBranchId(); + + BranchUndoLog branchUndoLog = new BranchUndoLog(); + branchUndoLog.setXid(xid); + branchUndoLog.setBranchId(branchID); + branchUndoLog.setSqlUndoLogs(connectionContext.getUndoItems()); + + String undoLogContent = UndoLogParserFactory.getInstance().encode(branchUndoLog); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Flushing UNDO LOG: " + undoLogContent); + } + + PreparedStatement pst = null; + try { + pst = cp.getTargetConnection().prepareStatement(INSERT_UNDO_LOG_SQL); + pst.setLong(1, branchID); + pst.setString(2, xid); + ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent.getBytes()); + pst.setBlob(3,inputStream); + pst.executeUpdate(); + } catch (Exception e) { + if (e instanceof SQLException) { + throw (SQLException)e; + } else { + throw new SQLException(e); + } + } finally { + if (pst != null) { + pst.close(); + } + } + + } + + private static void assertDbSupport(String dbType) { + if (!JdbcConstants.ORACLE.equalsIgnoreCase(dbType)) { + throw new NotSupportYetException("DbType[" + dbType + "] is not support yet!"); + } + } + + /** + * Undo. + * + * @param dataSourceProxy the data source proxy + * @param xid the xid + * @param branchId the branch id + * @throws TransactionException the transaction exception + */ + public static void undo(DataSourceProxy dataSourceProxy, String xid, long branchId) throws TransactionException { + assertDbSupport(dataSourceProxy.getTargetDataSource().getDbType()); + + Connection conn = null; + ResultSet rs = null; + PreparedStatement selectPST = null; + try { + conn = dataSourceProxy.getPlainConnection(); + + // The entire undo process should run in a local transaction. + conn.setAutoCommit(false); + + // Find UNDO LOG + selectPST = conn.prepareStatement(SELECT_UNDO_LOG_SQL); + selectPST.setLong(1, branchId); + selectPST.setString(2, xid); + rs = selectPST.executeQuery(); + + while (rs.next()) { + Blob b = rs.getBlob("rollback_info"); + String rollbackInfo = StringUtils.blob2string(b); + BranchUndoLog branchUndoLog = UndoLogParserFactory.getInstance().decode(rollbackInfo); + + for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { + TableMeta tableMeta = TableMetaCacheOracle.getTableMeta(dataSourceProxy, sqlUndoLog.getTableName()); + sqlUndoLog.setTableMeta(tableMeta); + AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(dataSourceProxy.getDbType(), + sqlUndoLog); + undoExecutor.executeOn(conn); + } + + } + deleteUndoLog(xid, branchId, conn); + + conn.commit(); + + } catch (Throwable e) { + if (conn != null) { + try { + conn.rollback(); + } catch (SQLException rollbackEx) { + LOGGER.warn("Failed to close JDBC resource while undo ... ", rollbackEx); + } + } + throw new TransactionException(BranchRollbackFailed_Retriable, String.format("%s/%s", branchId, xid), e); + + } finally { + try { + if (rs != null) { + rs.close(); + } + if (selectPST != null) { + selectPST.close(); + } + if (conn != null) { + conn.close(); + } + } catch (SQLException closeEx) { + LOGGER.warn("Failed to close JDBC resource while undo ... ", closeEx); + } + } + + } + + /** + * Delete undo log. + * + * @param xid the xid + * @param branchId the branch id + * @param conn the conn + * @throws SQLException the sql exception + */ + public static void deleteUndoLog(String xid, long branchId, Connection conn) throws SQLException { + PreparedStatement deletePST = conn.prepareStatement(DELETE_UNDO_LOG_SQL); + deletePST.setLong(1, branchId); + deletePST.setString(2, xid); + deletePST.executeUpdate(); + } +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java new file mode 100644 index 00000000000..849bfa110cb --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java @@ -0,0 +1,92 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.undo.oracle; + +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fescar.common.exception.ShouldNeverHappenException; +import com.alibaba.fescar.rm.datasource.sql.struct.Field; +import com.alibaba.fescar.rm.datasource.sql.struct.KeyType; +import com.alibaba.fescar.rm.datasource.sql.struct.Row; +import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; +import com.alibaba.fescar.rm.datasource.undo.AbstractUndoExecutor; +import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; +import com.alibaba.fescar.rm.datasource.undo.KeywordCheckerFactory; +import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; + +import java.util.List; + +/** + * The type My sql undo delete executor. + */ +public class ORACLEUndoDeleteExecutor extends AbstractUndoExecutor { + + /** + * Instantiates a new My sql undo delete executor. + * + * @param sqlUndoLog the sql undo log + */ + public ORACLEUndoDeleteExecutor(SQLUndoLog sqlUndoLog) { + super(sqlUndoLog); + } + + @Override + protected String buildUndoSQL() { + KeywordChecker keywordChecker= KeywordCheckerFactory.getKeywordChecker(JdbcConstants.ORACLE); + TableRecords beforeImage = sqlUndoLog.getBeforeImage(); + List beforeImageRows = beforeImage.getRows(); + if (beforeImageRows == null || beforeImageRows.size() == 0) { + throw new ShouldNeverHappenException("Invalid UNDO LOG"); + } + Row row = beforeImageRows.get(0); + + StringBuffer insertColumns = new StringBuffer(); + StringBuffer insertValues = new StringBuffer(); + Field pkField = null; + boolean first = true; + for (Field field : row.getFields()) { + if (field.getKeyType() == KeyType.PrimaryKey) { + pkField = field; + continue; + } else { + if (first) { + first = false; + } else { + insertColumns.append(", "); + insertValues.append(", "); + } + insertColumns.append(keywordChecker.checkAndReplace(field.getName())); + insertValues.append("?"); + } + + } + if (first) { + first = false; + } else { + insertColumns.append(", "); + insertValues.append(", "); + } + insertColumns.append(keywordChecker.checkAndReplace(pkField.getName())); + insertValues.append("?"); + + return "INSERT INTO " + keywordChecker.checkAndReplace(sqlUndoLog.getTableName()) + "(" + insertColumns.toString() + ") VALUES (" + insertValues.toString() + ")"; + } + + @Override + protected TableRecords getUndoRows() { + return sqlUndoLog.getBeforeImage(); + } +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java new file mode 100644 index 00000000000..a6cc19bbce6 --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java @@ -0,0 +1,79 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.undo.oracle; + +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fescar.common.exception.ShouldNeverHappenException; +import com.alibaba.fescar.rm.datasource.sql.struct.Field; +import com.alibaba.fescar.rm.datasource.sql.struct.KeyType; +import com.alibaba.fescar.rm.datasource.sql.struct.Row; +import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; +import com.alibaba.fescar.rm.datasource.undo.AbstractUndoExecutor; +import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; +import com.alibaba.fescar.rm.datasource.undo.KeywordCheckerFactory; +import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * The type My sql undo insert executor. + */ +public class ORACLEUndoInsertExecutor extends AbstractUndoExecutor { + + @Override + protected String buildUndoSQL() { + KeywordChecker keywordChecker= KeywordCheckerFactory.getKeywordChecker(JdbcConstants.ORACLE); + TableRecords afterImage = sqlUndoLog.getAfterImage(); + List afterImageRows = afterImage.getRows(); + if (afterImageRows == null || afterImageRows.size() == 0) { + throw new ShouldNeverHappenException("Invalid UNDO LOG"); + } + Row row = afterImageRows.get(0); + StringBuffer mainSQL = new StringBuffer("DELETE FROM " + keywordChecker.checkAndReplace(sqlUndoLog.getTableName())); + StringBuffer where = new StringBuffer(" WHERE "); + boolean first = true; + for (Field field : row.getFields()) { + if (field.getKeyType() == KeyType.PrimaryKey) { + where.append(keywordChecker.checkAndReplace(field.getName()) +" = ?"); + } + + } + return mainSQL.append(where).toString(); + } + + @Override + protected void undoPrepare(PreparedStatement undoPST, ArrayList undoValues, Field pkValue) throws SQLException { + undoPST.setObject(1, pkValue.getValue(), pkValue.getType()); + } + + /** + * Instantiates a new My sql undo insert executor. + * + * @param sqlUndoLog the sql undo log + */ + public ORACLEUndoInsertExecutor(SQLUndoLog sqlUndoLog) { + super(sqlUndoLog); + } + + @Override + protected TableRecords getUndoRows() { + return sqlUndoLog.getAfterImage(); + } +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java new file mode 100644 index 00000000000..927eb4dd9fb --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java @@ -0,0 +1,78 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.undo.oracle; + +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fescar.common.exception.ShouldNeverHappenException; +import com.alibaba.fescar.rm.datasource.sql.struct.Field; +import com.alibaba.fescar.rm.datasource.sql.struct.KeyType; +import com.alibaba.fescar.rm.datasource.sql.struct.Row; +import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; +import com.alibaba.fescar.rm.datasource.undo.AbstractUndoExecutor; +import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; +import com.alibaba.fescar.rm.datasource.undo.KeywordCheckerFactory; +import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; + +import java.util.List; + +/** + * The type My sql undo update executor. + */ +public class ORACLEUndoUpdateExecutor extends AbstractUndoExecutor { + + @Override + protected String buildUndoSQL() { + KeywordChecker keywordChecker= KeywordCheckerFactory.getKeywordChecker(JdbcConstants.ORACLE); + TableRecords beforeImage = sqlUndoLog.getBeforeImage(); + List beforeImageRows = beforeImage.getRows(); + if (beforeImageRows == null || beforeImageRows.size() == 0) { + throw new ShouldNeverHappenException("Invalid UNDO LOG"); // TODO + } + Row row = beforeImageRows.get(0); + StringBuffer mainSQL = new StringBuffer("UPDATE " + keywordChecker.checkAndReplace(sqlUndoLog.getTableName()) + " SET "); + StringBuffer where = new StringBuffer(" WHERE "); + boolean first = true; + for (Field field : row.getFields()) { + if (field.getKeyType() == KeyType.PrimaryKey) { + where.append(keywordChecker.checkAndReplace(field.getName()) +" = ?"); + } else { + if (first) { + first = false; + } else { + mainSQL.append(", "); + } + mainSQL.append(keywordChecker.checkAndReplace(field.getName()) +" = ?"); + } + + } + return mainSQL.append(where).toString(); + } + + /** + * Instantiates a new My sql undo update executor. + * + * @param sqlUndoLog the sql undo log + */ + public ORACLEUndoUpdateExecutor(SQLUndoLog sqlUndoLog) { + super(sqlUndoLog); + } + + @Override + protected TableRecords getUndoRows() { + return sqlUndoLog.getBeforeImage(); + } +} diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java new file mode 100644 index 00000000000..60cc04ff080 --- /dev/null +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java @@ -0,0 +1,212 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.fescar.rm.datasource.undo.oracle.keyword; + +import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; +import org.apache.commons.lang3.StringUtils; + + +/** + * @author Wu + * @date 2019/3/5 + * MySQL keyword checker + */ +public class ORACLEKeywordChecker implements KeywordChecker { + private static volatile KeywordChecker keywordChecker; + + private ORACLEKeywordChecker(){} + + /** + * get instance of type MySQL keyword checker + * @return + */ + public static KeywordChecker getInstance(){ + if(keywordChecker==null){ + synchronized (ORACLEKeywordChecker.class){ + if(keywordChecker==null){ + keywordChecker=new ORACLEKeywordChecker(); + } + } + } + return keywordChecker; + } + /** + * MySQL keyword + */ + private enum MySQLKeyword { + SELECT("SELECT"), + DELETE("DELETE"), + INSERT("INSERT"), + UPDATE("UPDATE"), + + FROM("FROM"), + HAVING("HAVING"), + WHERE("WHERE"), + ORDER("ORDER"), + BY("BY"), + GROUP("GROUP"), + INTO("INTO"), + AS("AS"), + + CREATE("CREATE"), + ALTER("ALTER"), + DROP("DROP"), + SET("SET"), + + NULL("NULL"), + NOT("NOT"), + DISTINCT("DISTINCT"), + + TABLE("TABLE"), + TABLESPACE("TABLESPACE"), + VIEW("VIEW"), + SEQUENCE("SEQUENCE"), + TRIGGER("TRIGGER"), + USER("USER"), + INDEX("INDEX"), + SESSION("SESSION"), + PROCEDURE("PROCEDURE"), + FUNCTION("FUNCTION"), + + PRIMARY("PRIMARY"), + KEY("KEY"), + DEFAULT("DEFAULT"), + CONSTRAINT("CONSTRAINT"), + CHECK("CHECK"), + UNIQUE("UNIQUE"), + FOREIGN("FOREIGN"), + REFERENCES("REFERENCES"), + + EXPLAIN("EXPLAIN"), + FOR("FOR"), + IF("IF"), + SORT("SORT"), + + + ALL("ALL"), + UNION("UNION"), + EXCEPT("EXCEPT"), + INTERSECT("INTERSECT"), + MINUS("MINUS"), + INNER("INNER"), + LEFT("LEFT"), + RIGHT("RIGHT"), + FULL("FULL"), + OUTER("OUTER"), + JOIN("JOIN"), + ON("ON"), + SCHEMA("SCHEMA"), + CAST("CAST"), + COLUMN("COLUMN"), + USE("USE"), + DATABASE("DATABASE"), + TO("TO"), + + AND("AND"), + OR("OR"), + XOR("XOR"), + CASE("CASE"), + WHEN("WHEN"), + THEN("THEN"), + ELSE("ELSE"), + ELSIF("ELSIF"), + END("END"), + EXISTS("EXISTS"), + IN("IN"), + CONTAINS("CONTAINS"), + RLIKE("RLIKE"), + FULLTEXT("FULLTEXT"), + + NEW("NEW"), + ASC("ASC"), + DESC("DESC"), + IS("IS"), + LIKE("LIKE"), + ESCAPE("ESCAPE"), + BETWEEN("BETWEEN"), + VALUES("VALUES"), + INTERVAL("INTERVAL"), + + LOCK("LOCK"), + SOME("SOME"), + ANY("ANY"), + TRUNCATE("TRUNCATE"), + + RETURN("RETURN"), + + // mysql + TRUE("TRUE"), + FALSE("FALSE"), + LIMIT("LIMIT"), + KILL("KILL"), + IDENTIFIED("IDENTIFIED"), + PASSWORD("PASSWORD"), + ALGORITHM("ALGORITHM"), + DUAL("DUAL"), + BINARY("BINARY"), + SHOW("SHOW"), + REPLACE("REPLACE"), + + + // MySql procedure add by zz + WHILE("WHILE"), + DO("DO"), + LEAVE("LEAVE"), + ITERATE("ITERATE"), + REPEAT("REPEAT"), + UNTIL("UNTIL"), + OPEN("OPEN"), + CLOSE("CLOSE"), + OUT("OUT"), + INOUT("INOUT"), + EXIT("EXIT"), + UNDO("UNDO"), + SQLSTATE("SQLSTATE"), + CONDITION("CONDITION"), + DIV("DIV"); + + public final String name; + + MySQLKeyword() { + this(null); + } + + MySQLKeyword(String name) { + this.name = name; + } + } + + + @Override + public boolean check(String fieldOrTableName) { + try { + if (StringUtils.isNotBlank(fieldOrTableName)) { + MySQLKeyword.valueOf(fieldOrTableName.toUpperCase()); + return true; + } + } catch (IllegalArgumentException e) { + //do nothing + } + return false; + } + + @Override + public String checkAndReplace(String fieldOrTableName) { + return check(fieldOrTableName)? fieldOrTableName :fieldOrTableName; +// return check(fieldOrTableName)?"`" + fieldOrTableName + "`":fieldOrTableName; + } +} From ca6a13a8a857406641c96cbea0238366f43e579b Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 25 Mar 2019 11:17:55 +0800 Subject: [PATCH 02/32] =?UTF-8?q?=E4=BF=AE=E6=94=B9ORACLEKeywordChecker?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E6=9C=80=E6=96=B0MySQLKeywordChecker?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=8C=E5=91=BD=E5=90=8D=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oracle/keyword/ORACLEKeywordChecker.java | 357 ++++++++++++++---- 1 file changed, 292 insertions(+), 65 deletions(-) diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java index 60cc04ff080..b310a0e217c 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java @@ -1,3 +1,4 @@ + /* * Copyright 1999-2018 Alibaba Group Holding Ltd. * @@ -17,175 +18,402 @@ package com.alibaba.fescar.rm.datasource.undo.oracle.keyword; import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; -import org.apache.commons.lang3.StringUtils; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; /** - * @author Wu - * @date 2019/3/5 - * MySQL keyword checker + * The type oracle sql keyword checker. + * + * @author ccg + * @date 2019/3/25 oracle keyword checker */ public class ORACLEKeywordChecker implements KeywordChecker { - private static volatile KeywordChecker keywordChecker; + private static volatile KeywordChecker keywordChecker = null; + private static volatile Set keywordSet = null; - private ORACLEKeywordChecker(){} + private ORACLEKeywordChecker() { + } /** - * get instance of type MySQL keyword checker - * @return + * get instance of type oracle keyword checker + * + * @return instance */ - public static KeywordChecker getInstance(){ - if(keywordChecker==null){ - synchronized (ORACLEKeywordChecker.class){ - if(keywordChecker==null){ - keywordChecker=new ORACLEKeywordChecker(); + public static KeywordChecker getInstance() { + if (keywordChecker == null) { + synchronized (ORACLEKeywordChecker.class) { + if (keywordChecker == null) { + keywordChecker = new ORACLEKeywordChecker(); + keywordSet = Arrays.stream(OracleKeyword.values()).map(OracleKeyword::name).collect(Collectors.toSet()); } } } return keywordChecker; } + /** - * MySQL keyword + * oracle keyword */ - private enum MySQLKeyword { + private enum OracleKeyword { + /** + * Select sql keyword. + */ SELECT("SELECT"), + /** + * Delete sql keyword. + */ DELETE("DELETE"), + /** + * Insert sql keyword. + */ INSERT("INSERT"), + /** + * Update sql keyword. + */ UPDATE("UPDATE"), + /** + * From sql keyword. + */ FROM("FROM"), + /** + * Having sql keyword. + */ HAVING("HAVING"), + /** + * Where sql keyword. + */ WHERE("WHERE"), + /** + * Order sql keyword. + */ ORDER("ORDER"), + /** + * By sql keyword. + */ BY("BY"), + /** + * Group sql keyword. + */ GROUP("GROUP"), + /** + * Into sql keyword. + */ INTO("INTO"), + /** + * As sql keyword. + */ AS("AS"), + /** + * Create sql keyword. + */ CREATE("CREATE"), + /** + * Alter sql keyword. + */ ALTER("ALTER"), + /** + * Drop sql keyword. + */ DROP("DROP"), + /** + * Set sql keyword. + */ SET("SET"), + /** + * Null sql keyword. + */ NULL("NULL"), + /** + * Not sql keyword. + */ NOT("NOT"), + /** + * Distinct sql keyword. + */ DISTINCT("DISTINCT"), + /** + * Table sql keyword. + */ TABLE("TABLE"), + /** + * Tablespace sql keyword. + */ TABLESPACE("TABLESPACE"), + /** + * View sql keyword. + */ VIEW("VIEW"), + /** + * Sequence sql keyword. + */ SEQUENCE("SEQUENCE"), + /** + * Trigger sql keyword. + */ TRIGGER("TRIGGER"), + /** + * User sql keyword. + */ USER("USER"), + /** + * Index sql keyword. + */ INDEX("INDEX"), + /** + * Session sql keyword. + */ SESSION("SESSION"), + /** + * Procedure sql keyword. + */ PROCEDURE("PROCEDURE"), + /** + * Function sql keyword. + */ FUNCTION("FUNCTION"), + /** + * Primary sql keyword. + */ PRIMARY("PRIMARY"), + /** + * Key sql keyword. + */ KEY("KEY"), + /** + * Default sql keyword. + */ DEFAULT("DEFAULT"), + /** + * Constraint sql keyword. + */ CONSTRAINT("CONSTRAINT"), + /** + * Check sql keyword. + */ CHECK("CHECK"), + /** + * Unique sql keyword. + */ UNIQUE("UNIQUE"), + /** + * Foreign sql keyword. + */ FOREIGN("FOREIGN"), + /** + * References sql keyword. + */ REFERENCES("REFERENCES"), + /** + * Explain sql keyword. + */ EXPLAIN("EXPLAIN"), + /** + * For sql keyword. + */ FOR("FOR"), + /** + * If sql keyword. + */ IF("IF"), + /** + * Sort sql keyword. + */ SORT("SORT"), - + /** + * All sql keyword. + */ ALL("ALL"), + /** + * Union sql keyword. + */ UNION("UNION"), + /** + * Except sql keyword. + */ EXCEPT("EXCEPT"), + /** + * Intersect sql keyword. + */ INTERSECT("INTERSECT"), + /** + * Minus sql keyword. + */ MINUS("MINUS"), + /** + * Inner sql keyword. + */ INNER("INNER"), + /** + * Left sql keyword. + */ LEFT("LEFT"), + /** + * Right sql keyword. + */ RIGHT("RIGHT"), + /** + * Full sql keyword. + */ FULL("FULL"), + /** + * Outer sql keyword. + */ OUTER("OUTER"), + /** + * Join sql keyword. + */ JOIN("JOIN"), + /** + * On sql keyword. + */ ON("ON"), + /** + * Schema sql keyword. + */ SCHEMA("SCHEMA"), + /** + * Cast sql keyword. + */ CAST("CAST"), + /** + * Column sql keyword. + */ COLUMN("COLUMN"), + /** + * Use sql keyword. + */ USE("USE"), + /** + * Database sql keyword. + */ DATABASE("DATABASE"), + /** + * To sql keyword. + */ TO("TO"), + /** + * And sql keyword. + */ AND("AND"), + /** + * Or sql keyword. + */ OR("OR"), + /** + * Xor sql keyword. + */ XOR("XOR"), + /** + * Case sql keyword. + */ CASE("CASE"), + /** + * When sql keyword. + */ WHEN("WHEN"), + /** + * Then sql keyword. + */ THEN("THEN"), + /** + * Else sql keyword. + */ ELSE("ELSE"), + /** + * Elsif sql keyword. + */ ELSIF("ELSIF"), + /** + * End sql keyword. + */ END("END"), + /** + * Exists sql keyword. + */ EXISTS("EXISTS"), + /** + * In sql keyword. + */ IN("IN"), + /** + * Contains sql keyword. + */ CONTAINS("CONTAINS"), + /** + * Rlike sql keyword. + */ RLIKE("RLIKE"), + /** + * Fulltext sql keyword. + */ FULLTEXT("FULLTEXT"), + /** + * New sql keyword. + */ NEW("NEW"), + /** + * Asc sql keyword. + */ ASC("ASC"), + /** + * Desc sql keyword. + */ DESC("DESC"), + /** + * Is sql keyword. + */ IS("IS"), + /** + * Like sql keyword. + */ LIKE("LIKE"), + /** + * Escape sql keyword. + */ ESCAPE("ESCAPE"), + /** + * Between sql keyword. + */ BETWEEN("BETWEEN"), + /** + * Values sql keyword. + */ VALUES("VALUES"), + /** + * Interval sql keyword. + */ INTERVAL("INTERVAL"), + /** + * Lock sql keyword. + */ LOCK("LOCK"), - SOME("SOME"), - ANY("ANY"), - TRUNCATE("TRUNCATE"), - - RETURN("RETURN"), - - // mysql - TRUE("TRUE"), - FALSE("FALSE"), - LIMIT("LIMIT"), - KILL("KILL"), - IDENTIFIED("IDENTIFIED"), - PASSWORD("PASSWORD"), - ALGORITHM("ALGORITHM"), - DUAL("DUAL"), - BINARY("BINARY"), - SHOW("SHOW"), - REPLACE("REPLACE"), - - - // MySql procedure add by zz - WHILE("WHILE"), - DO("DO"), - LEAVE("LEAVE"), - ITERATE("ITERATE"), - REPEAT("REPEAT"), - UNTIL("UNTIL"), - OPEN("OPEN"), - CLOSE("CLOSE"), - OUT("OUT"), - INOUT("INOUT"), - EXIT("EXIT"), - UNDO("UNDO"), - SQLSTATE("SQLSTATE"), - CONDITION("CONDITION"), - DIV("DIV"); + + /** + * Some sql keyword. + */ + - public final String name; + SOME("SOME"); - MySQLKeyword() { - this(null); - } - MySQLKeyword(String name) { + /** + * The Name. + */ + public final String name; + + OracleKeyword(String name) { this.name = name; } } @@ -193,15 +421,14 @@ private enum MySQLKeyword { @Override public boolean check(String fieldOrTableName) { - try { - if (StringUtils.isNotBlank(fieldOrTableName)) { - MySQLKeyword.valueOf(fieldOrTableName.toUpperCase()); - return true; - } - } catch (IllegalArgumentException e) { - //do nothing + if (keywordSet.contains(fieldOrTableName)) { + return true; + } + if (null != fieldOrTableName) { + fieldOrTableName = fieldOrTableName.toUpperCase(); } - return false; + return keywordSet.contains(fieldOrTableName); + } @Override From d91306d8320b3de41ac8d1da288ba1a54e0db9b8 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 25 Mar 2019 13:17:57 +0800 Subject: [PATCH 03/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=EF=BC=8C=E8=A7=84=E8=8C=83=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java | 4 +++- .../datasource/sql/druid/oracle/ORACLEInsertRecognizer.java | 4 +++- .../sql/druid/oracle/ORACLESelectForUpdateRecognizer.java | 4 +++- .../datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java | 4 +++- .../fescar/rm/datasource/undo/UndoLogManagerOracle.java | 2 ++ .../rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java | 4 +++- .../rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java | 4 +++- .../rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java | 4 +++- 8 files changed, 23 insertions(+), 7 deletions(-) diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java index 76c162581a0..511d5a91ed9 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java @@ -33,7 +33,9 @@ import java.util.ArrayList; /** - * The type My sql delete recognizer. + * The type oralce delete recognizer. + * @author ccg + * @date 2019/3/25 */ public class ORACLEDeleteRecognizer extends BaseRecognizer implements SQLDeleteRecognizer { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java index cf2d740ffd0..886dcf8873f 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java @@ -36,7 +36,9 @@ import java.util.List; /** - * The type My sql insert recognizer. + * The type oralce insert recognizer. + * @author ccg + * @date 2019/3/25 */ public class ORACLEInsertRecognizer extends BaseRecognizer implements SQLInsertRecognizer { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java index 77eee992ae3..2b699fc3e09 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java @@ -31,7 +31,9 @@ import java.util.ArrayList; /** - * The type My sql select for update recognizer. + * The type oralceselect for update recognizer. + * @author ccg + * @date 2019/3/25 */ public class ORACLESelectForUpdateRecognizer extends BaseRecognizer implements SQLSelectRecognizer { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java index 4e76c7e810c..eec2e0c1da0 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java @@ -36,7 +36,9 @@ import java.util.List; /** - * The type My sql update recognizer. + * The type oracle update recognizer. + * @author ccg + * @date 2019/3/25 */ public class ORACLEUpdateRecognizer extends BaseRecognizer implements SQLUpdateRecognizer { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java index 3ee84431e9f..f447a31f90d 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoLogManagerOracle.java @@ -41,6 +41,8 @@ /** * The type Undo log manager. + * @author ccg + * @date 2019/3/25 */ public final class UndoLogManagerOracle { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java index 849bfa110cb..dc703d69da3 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java @@ -30,7 +30,9 @@ import java.util.List; /** - * The type My sql undo delete executor. + * The type oracle undo delete executor. + * @author ccg + * @date 2019/3/25 */ public class ORACLEUndoDeleteExecutor extends AbstractUndoExecutor { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java index a6cc19bbce6..af4a073cb2d 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java @@ -33,7 +33,9 @@ import java.util.List; /** - * The type My sql undo insert executor. + * The type oralce undo insert executor. + * @author ccg + * @date 2019/3/25 */ public class ORACLEUndoInsertExecutor extends AbstractUndoExecutor { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java index 927eb4dd9fb..855d96f745e 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java @@ -30,7 +30,9 @@ import java.util.List; /** - * The type My sql undo update executor. + * The type oracle undo update executor. + * @author ccg + * @date 2019/3/25 */ public class ORACLEUndoUpdateExecutor extends AbstractUndoExecutor { From ab359d4a64c538f56dceed82c870ea419728c7dd Mon Sep 17 00:00:00 2001 From: ccg Date: Tue, 2 Apr 2019 11:38:41 +0800 Subject: [PATCH 04/32] =?UTF-8?q?=E6=8A=A5ORACLE=E5=BC=80=E5=A4=B4?= =?UTF-8?q?=E7=9A=84=E7=B1=BB=E5=90=8D=E8=AF=A5=E4=B8=BAOracle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rm/datasource/sql/SQLVisitorFactory.java | 16 ++++++++-------- ...cognizer.java => OracleDeleteRecognizer.java} | 4 ++-- ...cognizer.java => OracleInsertRecognizer.java} | 4 ++-- ...java => OracleSelectForUpdateRecognizer.java} | 4 ++-- ...cognizer.java => OracleUpdateRecognizer.java} | 4 ++-- .../datasource/undo/KeywordCheckerFactory.java | 4 ++-- .../rm/datasource/undo/UndoExecutorFactory.java | 8 ++++---- ...ecutor.java => OracleUndoDeleteExecutor.java} | 4 ++-- ...ecutor.java => OracleUndoInsertExecutor.java} | 4 ++-- ...ecutor.java => OracleUndoUpdateExecutor.java} | 4 ++-- ...ordChecker.java => OracleKeywordChecker.java} | 8 ++++---- 11 files changed, 32 insertions(+), 32 deletions(-) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/{ORACLEDeleteRecognizer.java => OracleDeleteRecognizer.java} (96%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/{ORACLEInsertRecognizer.java => OracleInsertRecognizer.java} (97%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/{ORACLESelectForUpdateRecognizer.java => OracleSelectForUpdateRecognizer.java} (97%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/{ORACLEUpdateRecognizer.java => OracleUpdateRecognizer.java} (97%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/{ORACLEUndoDeleteExecutor.java => OracleUndoDeleteExecutor.java} (96%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/{ORACLEUndoInsertExecutor.java => OracleUndoInsertExecutor.java} (95%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/{ORACLEUndoUpdateExecutor.java => OracleUndoUpdateExecutor.java} (95%) rename rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/{ORACLEKeywordChecker.java => OracleKeywordChecker.java} (97%) diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java index 85cb5cab5d8..eafa51770b4 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/SQLVisitorFactory.java @@ -29,10 +29,10 @@ import com.alibaba.fescar.rm.datasource.sql.druid.MySQLInsertRecognizer; import com.alibaba.fescar.rm.datasource.sql.druid.MySQLSelectForUpdateRecognizer; import com.alibaba.fescar.rm.datasource.sql.druid.MySQLUpdateRecognizer; -import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLEDeleteRecognizer; -import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLEInsertRecognizer; -import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLESelectForUpdateRecognizer; -import com.alibaba.fescar.rm.datasource.sql.druid.oracle.ORACLEUpdateRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.OracleDeleteRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.OracleInsertRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.OracleSelectForUpdateRecognizer; +import com.alibaba.fescar.rm.datasource.sql.druid.oracle.OracleUpdateRecognizer; /** * The type Sql visitor factory. @@ -67,14 +67,14 @@ public static SQLRecognizer get(String sql, String dbType) { } } else if (JdbcConstants.ORACLE.equalsIgnoreCase(dbType)) { if (ast instanceof SQLInsertStatement) { - recognizer = new ORACLEInsertRecognizer(sql, ast); + recognizer = new OracleInsertRecognizer(sql, ast); } else if (ast instanceof SQLUpdateStatement) { - recognizer = new ORACLEUpdateRecognizer(sql, ast); + recognizer = new OracleUpdateRecognizer(sql, ast); } else if (ast instanceof SQLDeleteStatement) { - recognizer = new ORACLEDeleteRecognizer(sql, ast); + recognizer = new OracleDeleteRecognizer(sql, ast); } else if (ast instanceof SQLSelectStatement) { if (((SQLSelectStatement) ast).getSelect().getQueryBlock().isForUpdate()) { - recognizer = new ORACLESelectForUpdateRecognizer(sql, ast); + recognizer = new OracleSelectForUpdateRecognizer(sql, ast); } } }else { diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java similarity index 96% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java index 511d5a91ed9..3bae057a8ef 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEDeleteRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java @@ -37,7 +37,7 @@ * @author ccg * @date 2019/3/25 */ -public class ORACLEDeleteRecognizer extends BaseRecognizer implements SQLDeleteRecognizer { +public class OracleDeleteRecognizer extends BaseRecognizer implements SQLDeleteRecognizer { private final OracleDeleteStatement ast; @@ -47,7 +47,7 @@ public class ORACLEDeleteRecognizer extends BaseRecognizer implements SQLDeleteR * @param originalSQL the original sql * @param ast the ast */ - public ORACLEDeleteRecognizer(String originalSQL, SQLStatement ast) { + public OracleDeleteRecognizer(String originalSQL, SQLStatement ast) { super(originalSQL); this.ast = (OracleDeleteStatement) ast; } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java similarity index 97% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java index 886dcf8873f..32e0bcaba61 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEInsertRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java @@ -40,7 +40,7 @@ * @author ccg * @date 2019/3/25 */ -public class ORACLEInsertRecognizer extends BaseRecognizer implements SQLInsertRecognizer { +public class OracleInsertRecognizer extends BaseRecognizer implements SQLInsertRecognizer { private final OracleInsertStatement ast; @@ -50,7 +50,7 @@ public class ORACLEInsertRecognizer extends BaseRecognizer implements SQLInsertR * @param originalSQL the original sql * @param ast the ast */ - public ORACLEInsertRecognizer(String originalSQL, SQLStatement ast) { + public OracleInsertRecognizer(String originalSQL, SQLStatement ast) { super(originalSQL); this.ast = (OracleInsertStatement) ast; } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java similarity index 97% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java index 2b699fc3e09..26d20dd130d 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLESelectForUpdateRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java @@ -36,7 +36,7 @@ * @date 2019/3/25 */ -public class ORACLESelectForUpdateRecognizer extends BaseRecognizer implements SQLSelectRecognizer { +public class OracleSelectForUpdateRecognizer extends BaseRecognizer implements SQLSelectRecognizer { private final SQLSelectStatement ast; @@ -46,7 +46,7 @@ public class ORACLESelectForUpdateRecognizer extends BaseRecognizer implements S * @param originalSQL the original sql * @param ast the ast */ - public ORACLESelectForUpdateRecognizer(String originalSQL, SQLStatement ast) { + public OracleSelectForUpdateRecognizer(String originalSQL, SQLStatement ast) { super(originalSQL); this.ast = (SQLSelectStatement) ast; } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java similarity index 97% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java index eec2e0c1da0..08000a2395e 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/ORACLEUpdateRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java @@ -40,7 +40,7 @@ * @author ccg * @date 2019/3/25 */ -public class ORACLEUpdateRecognizer extends BaseRecognizer implements SQLUpdateRecognizer { +public class OracleUpdateRecognizer extends BaseRecognizer implements SQLUpdateRecognizer { private OracleUpdateStatement ast; @@ -50,7 +50,7 @@ public class ORACLEUpdateRecognizer extends BaseRecognizer implements SQLUpdateR * @param originalSQL the original sql * @param ast the ast */ - public ORACLEUpdateRecognizer(String originalSQL, SQLStatement ast) { + public OracleUpdateRecognizer(String originalSQL, SQLStatement ast) { super(originalSQL); this.ast = (OracleUpdateStatement) ast; } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java index 5c71f3cd89e..35a552e2ee8 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/KeywordCheckerFactory.java @@ -19,7 +19,7 @@ import com.alibaba.druid.util.JdbcConstants; import com.alibaba.fescar.common.exception.NotSupportYetException; import com.alibaba.fescar.rm.datasource.undo.mysql.keyword.MySQLKeywordChecker; -import com.alibaba.fescar.rm.datasource.undo.oracle.keyword.ORACLEKeywordChecker; +import com.alibaba.fescar.rm.datasource.undo.oracle.keyword.OracleKeywordChecker; /** * @author Wu @@ -38,7 +38,7 @@ public static KeywordChecker getKeywordChecker(String dbType) { if (dbType.equals(JdbcConstants.MYSQL)) { return MySQLKeywordChecker.getInstance(); } else if (dbType.equals(JdbcConstants.ORACLE)) { - return ORACLEKeywordChecker.getInstance(); + return OracleKeywordChecker.getInstance(); } else { throw new NotSupportYetException(dbType); } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java index 0706ddad65e..24afe074974 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/UndoExecutorFactory.java @@ -22,7 +22,7 @@ import com.alibaba.fescar.rm.datasource.undo.mysql.MySQLUndoDeleteExecutor; import com.alibaba.fescar.rm.datasource.undo.mysql.MySQLUndoInsertExecutor; import com.alibaba.fescar.rm.datasource.undo.mysql.MySQLUndoUpdateExecutor; -import com.alibaba.fescar.rm.datasource.undo.oracle.ORACLEUndoInsertExecutor; +import com.alibaba.fescar.rm.datasource.undo.oracle.OracleUndoInsertExecutor; /** * The type Undo executor factory. @@ -43,11 +43,11 @@ public static AbstractUndoExecutor getUndoExecutor(String dbType, SQLUndoLog sql if(dbType.equalsIgnoreCase(JdbcConstants.ORACLE)) { switch (sqlUndoLog.getSqlType()) { case INSERT: - return new ORACLEUndoInsertExecutor(sqlUndoLog); + return new OracleUndoInsertExecutor(sqlUndoLog); case UPDATE: - return new ORACLEUndoInsertExecutor(sqlUndoLog); + return new OracleUndoInsertExecutor(sqlUndoLog); case DELETE: - return new ORACLEUndoInsertExecutor(sqlUndoLog); + return new OracleUndoInsertExecutor(sqlUndoLog); default: throw new ShouldNeverHappenException(); } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java similarity index 96% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java index dc703d69da3..7b1083fbc83 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoDeleteExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java @@ -34,14 +34,14 @@ * @author ccg * @date 2019/3/25 */ -public class ORACLEUndoDeleteExecutor extends AbstractUndoExecutor { +public class OracleUndoDeleteExecutor extends AbstractUndoExecutor { /** * Instantiates a new My sql undo delete executor. * * @param sqlUndoLog the sql undo log */ - public ORACLEUndoDeleteExecutor(SQLUndoLog sqlUndoLog) { + public OracleUndoDeleteExecutor(SQLUndoLog sqlUndoLog) { super(sqlUndoLog); } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java similarity index 95% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java index af4a073cb2d..6f8ebc37dc3 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoInsertExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java @@ -37,7 +37,7 @@ * @author ccg * @date 2019/3/25 */ -public class ORACLEUndoInsertExecutor extends AbstractUndoExecutor { +public class OracleUndoInsertExecutor extends AbstractUndoExecutor { @Override protected String buildUndoSQL() { @@ -70,7 +70,7 @@ protected void undoPrepare(PreparedStatement undoPST, ArrayList undoValue * * @param sqlUndoLog the sql undo log */ - public ORACLEUndoInsertExecutor(SQLUndoLog sqlUndoLog) { + public OracleUndoInsertExecutor(SQLUndoLog sqlUndoLog) { super(sqlUndoLog); } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java similarity index 95% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java index 855d96f745e..5caaf07f641 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/ORACLEUndoUpdateExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java @@ -34,7 +34,7 @@ * @author ccg * @date 2019/3/25 */ -public class ORACLEUndoUpdateExecutor extends AbstractUndoExecutor { +public class OracleUndoUpdateExecutor extends AbstractUndoExecutor { @Override protected String buildUndoSQL() { @@ -69,7 +69,7 @@ protected String buildUndoSQL() { * * @param sqlUndoLog the sql undo log */ - public ORACLEUndoUpdateExecutor(SQLUndoLog sqlUndoLog) { + public OracleUndoUpdateExecutor(SQLUndoLog sqlUndoLog) { super(sqlUndoLog); } diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java similarity index 97% rename from rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java rename to rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java index b310a0e217c..8eece5b073e 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/ORACLEKeywordChecker.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java @@ -29,11 +29,11 @@ * @author ccg * @date 2019/3/25 oracle keyword checker */ -public class ORACLEKeywordChecker implements KeywordChecker { +public class OracleKeywordChecker implements KeywordChecker { private static volatile KeywordChecker keywordChecker = null; private static volatile Set keywordSet = null; - private ORACLEKeywordChecker() { + private OracleKeywordChecker() { } /** @@ -43,9 +43,9 @@ private ORACLEKeywordChecker() { */ public static KeywordChecker getInstance() { if (keywordChecker == null) { - synchronized (ORACLEKeywordChecker.class) { + synchronized (OracleKeywordChecker.class) { if (keywordChecker == null) { - keywordChecker = new ORACLEKeywordChecker(); + keywordChecker = new OracleKeywordChecker(); keywordSet = Arrays.stream(OracleKeyword.values()).map(OracleKeyword::name).collect(Collectors.toSet()); } } From 99cdcce163c6d8bb865fa7ffc7e78bc9c0873b95 Mon Sep 17 00:00:00 2001 From: ccg Date: Tue, 2 Apr 2019 12:38:04 +0800 Subject: [PATCH 05/32] =?UTF-8?q?.*=20is=20an=20incorrect=20type=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89.*=20=E8=BF=99=E6=A0=B7=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E3=80=82=E4=BD=86idea=E8=87=AA=E5=B7=B1=E4=BC=9A?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E8=BF=99=E6=A0=B7=E7=9A=84=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rm/datasource/exec/BaseTransactionalExecutor.java | 6 +++++- .../sql/druid/oracle/OracleSelectForUpdateRecognizer.java | 6 +++++- .../rm/datasource/sql/struct/TableMetaCacheOracle.java | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java index 72f573985b6..e87e441e590 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/exec/BaseTransactionalExecutor.java @@ -26,7 +26,11 @@ import com.alibaba.fescar.rm.datasource.StatementProxy; import com.alibaba.fescar.rm.datasource.sql.SQLRecognizer; import com.alibaba.fescar.rm.datasource.sql.SQLType; -import com.alibaba.fescar.rm.datasource.sql.struct.*; +import com.alibaba.fescar.rm.datasource.sql.struct.Field; +import com.alibaba.fescar.rm.datasource.sql.struct.TableMeta; +import com.alibaba.fescar.rm.datasource.sql.struct.TableMetaCache; +import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; +import com.alibaba.fescar.rm.datasource.sql.struct.TableMetaCacheOracle; import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; /** diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java index 26d20dd130d..71dde17e8f8 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java @@ -20,7 +20,11 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.ast.statement.*; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.fescar.rm.datasource.ParametersHolder; import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java index d01a5942b16..14715250d0b 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/struct/TableMetaCacheOracle.java @@ -16,7 +16,11 @@ package com.alibaba.fescar.rm.datasource.sql.struct; -import java.sql.*; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSetMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; From d53f60a4fad7c03a329d9117e9379a3b80504b54 Mon Sep 17 00:00:00 2001 From: ccg Date: Tue, 2 Apr 2019 13:08:37 +0800 Subject: [PATCH 06/32] =?UTF-8?q?.*=20is=20an=20incorrect=20type=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89.*=20=E8=BF=99=E6=A0=B7=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E3=80=82=E4=BD=86idea=E8=87=AA=E5=B7=B1=E4=BC=9A?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E8=BF=99=E6=A0=B7=E7=9A=84=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/druid/oracle/OracleUpdateRecognizer.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java index 08000a2395e..d7f22212ad1 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java @@ -18,12 +18,16 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.expr.*; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.expr.SQLValuableExpr; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLInListExpr; +import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; import com.alibaba.fescar.rm.datasource.ParametersHolder; From e9cfa63f25dcc123e00a12fe16fa1fd7b541572a Mon Sep 17 00:00:00 2001 From: ccg Date: Thu, 4 Apr 2019 10:17:28 +0800 Subject: [PATCH 07/32] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java index 7b1083fbc83..0a573aed58f 100644 --- a/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java +++ b/rm-datasource/src/main/java/com/alibaba/fescar/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java @@ -37,7 +37,7 @@ public class OracleUndoDeleteExecutor extends AbstractUndoExecutor { /** - * Instantiates a new My sql undo delete executor. + * Instantiates a new oracle undo delete executor. * * @param sqlUndoLog the sql undo log */ From 494af9d0c5c7833abbed88da4e858777f421728c Mon Sep 17 00:00:00 2001 From: ccg Date: Thu, 25 Apr 2019 13:22:11 +0800 Subject: [PATCH 08/32] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 39 +++++++++++++++++++++---- server/src/main/resources/registry.conf | 10 +++---- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 1c2a01e308a..07cb4523b8f 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,21 @@ 1.9.5 1 0.7.6 + true + + + + releases + Nexus Release Repository + http://192.168.150.59:8081/repository/maven-releases/ + + + snapshots + http://192.168.150.59:8081/repository/maven-snapshots/ + + + @@ -361,15 +375,28 @@ + + + + + + + + + + + + - - openSource - https://oss.sonatype.org/content/repositories/snapshots/ - - openSource - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + releases + Nexus Release Repository + http://192.168.150.59:8081/repository/maven-releases/ + + snapshots + http://192.168.150.59:8081/repository/maven-snapshots/ + diff --git a/server/src/main/resources/registry.conf b/server/src/main/resources/registry.conf index fa9a4da9c60..35ef8d5dcd4 100644 --- a/server/src/main/resources/registry.conf +++ b/server/src/main/resources/registry.conf @@ -1,6 +1,6 @@ registry { # file 、nacos 、eureka、redis、zk - type = "file" + type = "zk" nacos { serverAddr = "localhost" @@ -18,7 +18,7 @@ registry { } zk { cluster = "default" - serverAddr = "127.0.0.1:2181" + serverAddr = "192.168.198.95:32056" session.timeout = 6000 connect.timeout = 2000 } @@ -29,7 +29,7 @@ registry { config { # file、nacos 、apollo、zk - type = "file" + type = "apollo" nacos { serverAddr = "localhost" @@ -37,8 +37,8 @@ config { cluster = "default" } apollo { - app.id = "fescar-server" - apollo.meta = "http://192.168.1.204:8801" + app.id = "seata-server" + apollo.meta = "http://192.168.198.97:30492" } zk { serverAddr = "127.0.0.1:2181" From 74aa7a35520e1bc14b0c6a8aa80f0acdd909678a Mon Sep 17 00:00:00 2001 From: ccg Date: Fri, 26 Apr 2019 11:38:40 +0800 Subject: [PATCH 09/32] =?UTF-8?q?=E6=94=AF=E6=8C=81oracle=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seata/rm/datasource/ConnectionProxy.java | 11 +- .../rm/datasource/DataSourceManager.java | 2 + .../exec/BaseTransactionalExecutor.java | 14 +- .../rm/datasource/sql/SQLVisitorFactory.java | 4 + .../druid/oracle/OracleDeleteRecognizer.java | 13 +- .../druid/oracle/OracleInsertRecognizer.java | 13 +- .../OracleSelectForUpdateRecognizer.java | 15 +- .../druid/oracle/OracleUpdateRecognizer.java | 15 +- .../sql/struct/TableMetaCacheOracle.java | 46 ++- .../undo/KeywordCheckerFactory.java | 1 + .../datasource/undo/UndoExecutorFactory.java | 1 + .../datasource/undo/UndoLogManagerOracle.java | 291 +++++++++++++----- .../undo/oracle/OracleUndoDeleteExecutor.java | 23 +- .../undo/oracle/OracleUndoInsertExecutor.java | 23 +- .../undo/oracle/OracleUndoUpdateExecutor.java | 23 +- .../oracle/keyword/OracleKeywordChecker.java | 8 +- server/src/main/resources/file.conf | 2 +- 17 files changed, 309 insertions(+), 196 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java b/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java index b523d09a390..5bd984e7eb1 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package io.seata.rm.datasource; +import com.alibaba.druid.util.JdbcConstants; import io.seata.config.ConfigurationFactory; import io.seata.core.constants.ConfigurationKeys; import io.seata.core.exception.TransactionException; @@ -23,8 +24,7 @@ import io.seata.core.model.BranchType; import io.seata.rm.DefaultResourceManager; import io.seata.rm.datasource.exec.LockConflictException; -import io.seata.rm.datasource.undo.SQLUndoLog; -import io.seata.rm.datasource.undo.UndoLogManager; +import io.seata.rm.datasource.undo.*; import io.seata.rm.datasource.exec.LockConflictException; import io.seata.rm.datasource.undo.SQLUndoLog; import io.seata.rm.datasource.undo.UndoLogManager; @@ -54,10 +54,9 @@ public class ConnectionProxy extends AbstractConnectionProxy { * * @param dataSourceProxy the data source proxy * @param targetConnection the target connection - * @param dbType the db type */ - public ConnectionProxy(DataSourceProxy dataSourceProxy, Connection targetConnection, String dbType) { - super(dataSourceProxy, targetConnection, dbType); + public ConnectionProxy(DataSourceProxy dataSourceProxy, Connection targetConnection) { + super(dataSourceProxy, targetConnection); } /** diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java index d0d8ee61806..c46f61813dd 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java @@ -21,6 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeoutException; +import com.alibaba.druid.util.JdbcConstants; import io.seata.common.exception.FrameworkException; import io.seata.common.exception.NotSupportYetException; import io.seata.common.exception.ShouldNeverHappenException; @@ -45,6 +46,7 @@ import io.seata.rm.datasource.undo.UndoLogManager; import io.seata.rm.datasource.undo.UndoLogManager; +import io.seata.rm.datasource.undo.UndoLogManagerOracle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java index 9db8ca9a4ad..dd5ed2ffb00 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,15 +19,13 @@ import java.sql.Statement; import java.util.List; +import com.alibaba.druid.util.JdbcConstants; import io.seata.core.context.RootContext; import io.seata.rm.datasource.ConnectionProxy; import io.seata.rm.datasource.StatementProxy; import io.seata.rm.datasource.sql.SQLRecognizer; import io.seata.rm.datasource.sql.SQLType; -import io.seata.rm.datasource.sql.struct.Field; -import io.seata.rm.datasource.sql.struct.TableMeta; -import io.seata.rm.datasource.sql.struct.TableMetaCache; -import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.sql.struct.*; import io.seata.rm.datasource.undo.SQLUndoLog; /** @@ -163,7 +161,11 @@ protected TableMeta getTableMeta(String tableName) { if (tableMeta != null) { return tableMeta; } - tableMeta = TableMetaCache.getTableMeta(statementProxy.getConnectionProxy().getDataSourceProxy(), tableName); + if(JdbcConstants.ORACLE.equalsIgnoreCase(statementProxy.getConnectionProxy().getDbType())) { + tableMeta = TableMetaCacheOracle.getTableMeta(statementProxy.getConnectionProxy().getDataSourceProxy(), tableName); + } else { + tableMeta = TableMetaCache.getTableMeta(statementProxy.getConnectionProxy().getDataSourceProxy(), tableName); + } return tableMeta; } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/SQLVisitorFactory.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/SQLVisitorFactory.java index f0ac1f60984..b27bbe500b8 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/SQLVisitorFactory.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/SQLVisitorFactory.java @@ -32,6 +32,10 @@ import io.seata.rm.datasource.sql.druid.MySQLInsertRecognizer; import io.seata.rm.datasource.sql.druid.MySQLSelectForUpdateRecognizer; import io.seata.rm.datasource.sql.druid.MySQLUpdateRecognizer; +import io.seata.rm.datasource.sql.druid.oracle.OracleDeleteRecognizer; +import io.seata.rm.datasource.sql.druid.oracle.OracleInsertRecognizer; +import io.seata.rm.datasource.sql.druid.oracle.OracleSelectForUpdateRecognizer; +import io.seata.rm.datasource.sql.druid.oracle.OracleUpdateRecognizer; /** * The type Sql visitor factory. diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java index 3bae057a8ef..415d8365ea6 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleDeleteRecognizer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.sql.druid.oracle; +package io.seata.rm.datasource.sql.druid.oracle; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; @@ -25,10 +24,10 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; -import com.alibaba.fescar.rm.datasource.ParametersHolder; -import com.alibaba.fescar.rm.datasource.sql.SQLDeleteRecognizer; -import com.alibaba.fescar.rm.datasource.sql.SQLType; -import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; +import io.seata.rm.datasource.ParametersHolder; +import io.seata.rm.datasource.sql.SQLDeleteRecognizer; +import io.seata.rm.datasource.sql.SQLType; +import io.seata.rm.datasource.sql.druid.BaseRecognizer; import java.util.ArrayList; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java index 32e0bcaba61..eaa558d5248 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleInsertRecognizer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.sql.druid.oracle; +package io.seata.rm.datasource.sql.druid.oracle; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; @@ -27,10 +26,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; -import com.alibaba.fescar.rm.datasource.sql.SQLInsertRecognizer; -import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; -import com.alibaba.fescar.rm.datasource.sql.SQLType; -import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; +import io.seata.rm.datasource.sql.SQLInsertRecognizer; +import io.seata.rm.datasource.sql.SQLParsingException; +import io.seata.rm.datasource.sql.SQLType; +import io.seata.rm.datasource.sql.druid.BaseRecognizer; import java.util.ArrayList; import java.util.List; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java index 71dde17e8f8..1e11d7378d3 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleSelectForUpdateRecognizer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.sql.druid.oracle; +package io.seata.rm.datasource.sql.druid.oracle; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; @@ -26,11 +25,11 @@ import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; -import com.alibaba.fescar.rm.datasource.ParametersHolder; -import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; -import com.alibaba.fescar.rm.datasource.sql.SQLSelectRecognizer; -import com.alibaba.fescar.rm.datasource.sql.SQLType; -import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; +import io.seata.rm.datasource.ParametersHolder; +import io.seata.rm.datasource.sql.SQLParsingException; +import io.seata.rm.datasource.sql.SQLSelectRecognizer; +import io.seata.rm.datasource.sql.SQLType; +import io.seata.rm.datasource.sql.druid.BaseRecognizer; import java.util.ArrayList; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java index d7f22212ad1..bbd6b12dba8 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/druid/oracle/OracleUpdateRecognizer.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.sql.druid.oracle; +package io.seata.rm.datasource.sql.druid.oracle; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; @@ -30,11 +29,11 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; -import com.alibaba.fescar.rm.datasource.ParametersHolder; -import com.alibaba.fescar.rm.datasource.sql.SQLParsingException; -import com.alibaba.fescar.rm.datasource.sql.SQLType; -import com.alibaba.fescar.rm.datasource.sql.SQLUpdateRecognizer; -import com.alibaba.fescar.rm.datasource.sql.druid.BaseRecognizer; +import io.seata.rm.datasource.ParametersHolder; +import io.seata.rm.datasource.sql.SQLParsingException; +import io.seata.rm.datasource.sql.SQLType; +import io.seata.rm.datasource.sql.SQLUpdateRecognizer; +import io.seata.rm.datasource.sql.druid.BaseRecognizer; import java.util.ArrayList; import java.util.List; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java index 14715250d0b..8c0293c7b2e 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.sql.struct; +package io.seata.rm.datasource.sql.struct; import java.sql.Connection; import java.sql.DatabaseMetaData; @@ -27,14 +26,16 @@ import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.util.StringUtils; -import com.alibaba.fescar.common.exception.ShouldNeverHappenException; -import com.alibaba.fescar.core.context.RootContext; -import com.alibaba.fescar.rm.datasource.AbstractConnectionProxy; -import com.alibaba.fescar.rm.datasource.DataSourceProxy; +import io.seata.common.exception.ShouldNeverHappenException; +import io.seata.core.context.RootContext; +import io.seata.rm.datasource.AbstractConnectionProxy; +import io.seata.rm.datasource.DataSourceProxy; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import javax.sql.DataSource; + /** * The type Table meta cache. */ @@ -50,27 +51,16 @@ public class TableMetaCacheOracle { /** * Gets table meta. * - * @param dataSourceProxy the data source proxy - * @param tableName the table name - * @return the table meta - */ - public static TableMeta getTableMeta(DataSourceProxy dataSourceProxy, String tableName) { - return getTableMeta(dataSourceProxy.getTargetDataSource(), tableName); - } - - /** - * Gets table meta. - * - * @param druidDataSource the druid data source + * @param dataSourceProxy the druid data source * @param tableName the table name * @return the table meta */ - public static TableMeta getTableMeta(final DruidDataSource druidDataSource, final String tableName) { + public static TableMeta getTableMeta(final DataSourceProxy dataSourceProxy, final String tableName) { if (StringUtils.isEmpty(tableName)) { throw new IllegalArgumentException("TableMeta cannot be fetched without tableName"); } - String dataSourceKey = druidDataSource.getUrl(); + String dataSourceKey = dataSourceProxy.getResourceId(); TableMeta tmeta = null; final String key = dataSourceKey + "." + tableName; @@ -78,7 +68,7 @@ public static TableMeta getTableMeta(final DruidDataSource druidDataSource, fina tmeta = TABLE_META_CACHE.get(key, new Callable() { @Override public TableMeta call() throws Exception { - return fetchSchema(druidDataSource, tableName); + return fetchSchema(dataSourceProxy.getTargetDataSource(), tableName); } }); } catch (ExecutionException e) { @@ -86,7 +76,7 @@ public TableMeta call() throws Exception { if (tmeta == null) { try { - tmeta = fetchSchema(druidDataSource, tableName); + tmeta = fetchSchema(dataSourceProxy.getTargetDataSource(), tableName); } catch (SQLException e) { } } @@ -97,17 +87,17 @@ public TableMeta call() throws Exception { return tmeta; } - private static TableMeta fetchSchema(DruidDataSource druidDataSource, String tableName) throws SQLException { - return fetchSchemeInDefaultWay(druidDataSource, tableName); + private static TableMeta fetchSchema(DataSource dataSource, String tableName) throws SQLException { + return fetchSchemeInDefaultWay(dataSource, tableName); } - private static TableMeta fetchSchemeInDefaultWay(DruidDataSource druidDataSource, String tableName) + private static TableMeta fetchSchemeInDefaultWay(DataSource dataSource, String tableName) throws SQLException { Connection conn = null; java.sql.Statement stmt = null; java.sql.ResultSet rs = null; try { - conn = druidDataSource.getConnection(); + conn = dataSource.getConnection(); stmt = conn.createStatement(); StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName ); rs = stmt.executeQuery(sb.toString()); @@ -236,7 +226,7 @@ private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseM String indexName = ""; while (rs2.next()) { indexName = rs2.getString("INDEX_NAME"); - if( org.apache.commons.lang3.StringUtils.isEmpty(indexName) ){ + if( StringUtils.isEmpty(indexName) ){ continue; } String colName = rs2.getString("COLUMN_NAME").toUpperCase(); diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/KeywordCheckerFactory.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/KeywordCheckerFactory.java index 3b882b28afb..584c844f9c4 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/KeywordCheckerFactory.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/KeywordCheckerFactory.java @@ -18,6 +18,7 @@ import com.alibaba.druid.util.JdbcConstants; import io.seata.common.exception.NotSupportYetException; import io.seata.rm.datasource.undo.mysql.keyword.MySQLKeywordChecker; +import io.seata.rm.datasource.undo.oracle.keyword.OracleKeywordChecker; /** * The type Keyword checker factory. diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java index ee2a8deed76..db00c66d241 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java @@ -21,6 +21,7 @@ import io.seata.rm.datasource.undo.mysql.MySQLUndoDeleteExecutor; import io.seata.rm.datasource.undo.mysql.MySQLUndoInsertExecutor; import io.seata.rm.datasource.undo.mysql.MySQLUndoUpdateExecutor; +import io.seata.rm.datasource.undo.oracle.OracleUndoInsertExecutor; /** * The type Undo executor factory. diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index f447a31f90d..4cbc4bfc9c7 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,31 +13,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.undo; +package io.seata.rm.datasource.undo; import java.io.ByteArrayInputStream; -import java.sql.Blob; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.sql.*; +import java.util.Set; import com.alibaba.druid.util.JdbcConstants; -import com.alibaba.fescar.common.exception.NotSupportYetException; -import com.alibaba.fescar.common.util.BlobUtils; -import com.alibaba.fescar.common.util.StringUtils; -import com.alibaba.fescar.core.exception.TransactionException; -import com.alibaba.fescar.rm.datasource.ConnectionContext; -import com.alibaba.fescar.rm.datasource.ConnectionProxy; -import com.alibaba.fescar.rm.datasource.DataSourceProxy; -import com.alibaba.fescar.rm.datasource.sql.struct.TableMeta; - -import com.alibaba.fescar.rm.datasource.sql.struct.TableMetaCacheOracle; +import io.seata.common.exception.NotSupportYetException; +import io.seata.common.util.BlobUtils; +import io.seata.common.util.CollectionUtils; +import io.seata.common.util.StringUtils; +import io.seata.core.exception.TransactionException; +import io.seata.rm.datasource.ConnectionContext; +import io.seata.rm.datasource.ConnectionProxy; +import io.seata.rm.datasource.DataSourceProxy; +import io.seata.rm.datasource.sql.struct.TableMeta; + +import io.seata.rm.datasource.sql.struct.TableMetaCacheOracle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static com.alibaba.fescar.core.exception.TransactionExceptionCode.BranchRollbackFailed_Retriable; +import static io.seata.core.exception.TransactionExceptionCode.BranchRollbackFailed_Retriable; /** * The type Undo log manager. @@ -46,6 +43,27 @@ */ public final class UndoLogManagerOracle { + private enum State { + /** + * This state can be properly rolled back by services + */ + Normal(0), + /** + * This state prevents the branch transaction from inserting undo_log after the global transaction is rolled + * back. + */ + GlobalFinished(1); + + private int value; + + State(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } private static final Logger LOGGER = LoggerFactory.getLogger(UndoLogManager.class); private static String UNDO_LOG_TABLE_NAME = "undo_log"; @@ -86,25 +104,7 @@ public static void flushUndoLogs(ConnectionProxy cp) throws SQLException { LOGGER.debug("Flushing UNDO LOG: " + undoLogContent); } - PreparedStatement pst = null; - try { - pst = cp.getTargetConnection().prepareStatement(INSERT_UNDO_LOG_SQL); - pst.setLong(1, branchID); - pst.setString(2, xid); - ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent.getBytes()); - pst.setBlob(3,inputStream); - pst.executeUpdate(); - } catch (Exception e) { - if (e instanceof SQLException) { - throw (SQLException)e; - } else { - throw new SQLException(e); - } - } finally { - if (pst != null) { - pst.close(); - } - } + insertUndoLogWithNormal(xid,branchID,undoLogContent,cp.getTargetConnection()); } @@ -123,67 +123,153 @@ private static void assertDbSupport(String dbType) { * @throws TransactionException the transaction exception */ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branchId) throws TransactionException { - assertDbSupport(dataSourceProxy.getTargetDataSource().getDbType()); + assertDbSupport(dataSourceProxy.getDbType()); Connection conn = null; ResultSet rs = null; PreparedStatement selectPST = null; - try { - conn = dataSourceProxy.getPlainConnection(); - - // The entire undo process should run in a local transaction. - conn.setAutoCommit(false); - - // Find UNDO LOG - selectPST = conn.prepareStatement(SELECT_UNDO_LOG_SQL); - selectPST.setLong(1, branchId); - selectPST.setString(2, xid); - rs = selectPST.executeQuery(); - - while (rs.next()) { - Blob b = rs.getBlob("rollback_info"); - String rollbackInfo = StringUtils.blob2string(b); - BranchUndoLog branchUndoLog = UndoLogParserFactory.getInstance().decode(rollbackInfo); - - for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { - TableMeta tableMeta = TableMetaCacheOracle.getTableMeta(dataSourceProxy, sqlUndoLog.getTableName()); - sqlUndoLog.setTableMeta(tableMeta); - AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(dataSourceProxy.getDbType(), - sqlUndoLog); - undoExecutor.executeOn(conn); - } - } - deleteUndoLog(xid, branchId, conn); + for (; ; ) { + try { + conn = dataSourceProxy.getPlainConnection(); - conn.commit(); + // The entire undo process should run in a local transaction. + conn.setAutoCommit(false); - } catch (Throwable e) { - if (conn != null) { - try { - conn.rollback(); - } catch (SQLException rollbackEx) { - LOGGER.warn("Failed to close JDBC resource while undo ... ", rollbackEx); - } - } - throw new TransactionException(BranchRollbackFailed_Retriable, String.format("%s/%s", branchId, xid), e); + // Find UNDO LOG + selectPST = conn.prepareStatement(SELECT_UNDO_LOG_SQL); + selectPST.setLong(1, branchId); + selectPST.setString(2, xid); + rs = selectPST.executeQuery(); + boolean exists = false; + while (rs.next()) { + exists = true; + // It is possible that the server repeatedly sends a rollback request to roll back + // the same branch transaction to multiple processes, + // ensuring that only the undo_log in the normal state is processed. + int state = rs.getInt("log_status"); + if (!canUndo(state)) { + LOGGER.info("xid {} branch {}, ignore {} undo_log", + xid, branchId, state); + return; + } + Blob b = rs.getBlob("rollback_info"); + String rollbackInfo = StringUtils.blob2string(b); + BranchUndoLog branchUndoLog = UndoLogParserFactory.getInstance().decode(rollbackInfo); + + for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { + TableMeta tableMeta = TableMetaCacheOracle.getTableMeta(dataSourceProxy, sqlUndoLog.getTableName()); + sqlUndoLog.setTableMeta(tableMeta); + AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(dataSourceProxy.getDbType(), + sqlUndoLog); + undoExecutor.executeOn(conn); + } - } finally { - try { - if (rs != null) { - rs.close(); } - if (selectPST != null) { - selectPST.close(); + // If undo_log exists, it means that the branch transaction has completed the first phase, + // we can directly roll back and clean the undo_log + // Otherwise, it indicates that there is an exception in the branch transaction, + // causing undo_log not to be written to the database. + // For example, the business processing timeout, the global transaction is the initiator rolls back. + // To ensure data consistency, we can insert an undo_log with GlobalFinished state + // to prevent the local transaction of the first phase of other programs from being correctly submitted. + // See https://github.com/seata/seata/issues/489 + + if (exists) { + deleteUndoLog(xid, branchId, conn); + conn.commit(); + LOGGER.info("xid {} branch {}, undo_log deleted with {}", + xid, branchId, UndoLogManagerOracle.State.GlobalFinished.name()); + } else { + insertUndoLogWithGlobalFinished(xid, branchId, conn); + conn.commit(); + LOGGER.info("xid {} branch {}, undo_log added with {}", + xid, branchId, UndoLogManagerOracle.State.GlobalFinished.name()); } + + return; + } catch (SQLIntegrityConstraintViolationException e) { + // Possible undo_log has been inserted into the database by other processes, retrying rollback undo_log + LOGGER.info("xid {} branch {}, undo_log inserted, retry rollback", + xid, branchId); + } catch (Throwable e) { if (conn != null) { - conn.close(); + try { + conn.rollback(); + } catch (SQLException rollbackEx) { + LOGGER.warn("Failed to close JDBC resource while undo ... ", rollbackEx); + } + } + throw new TransactionException(BranchRollbackFailed_Retriable, String.format("%s/%s", branchId, xid), e); + + } finally { + try { + if (rs != null) { + rs.close(); + } + if (selectPST != null) { + selectPST.close(); + } + if (conn != null) { + conn.close(); + } + } catch (SQLException closeEx) { + LOGGER.warn("Failed to close JDBC resource while undo ... ", closeEx); } - } catch (SQLException closeEx) { - LOGGER.warn("Failed to close JDBC resource while undo ... ", closeEx); } } + } + + /** + * batch Delete undo log. + * + * @param xids + * @param branchIds + * @param limitSize + * @param conn + */ + public static void batchDeleteUndoLog(Set xids, Set branchIds, int limitSize, Connection conn) throws SQLException { + if (CollectionUtils.isEmpty(xids) || CollectionUtils.isEmpty(branchIds)) { + return; + } + int xidSize = xids.size(); + int branchIdSize = branchIds.size(); + String batchDeleteSql = toBatchDeleteUndoLogSql(xidSize, branchIdSize,limitSize); + PreparedStatement deletePST = conn.prepareStatement(batchDeleteSql); + int paramsIndex = 1; + for (Long branchId : branchIds) { + deletePST.setLong(paramsIndex++,branchId); + } + for (String xid: xids){ + deletePST.setString(paramsIndex++, xid); + } + int deleteRows = deletePST.executeUpdate(); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("batch delete undo log size " + deleteRows); + } + } + protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize,int limitSize) { + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append("DELETE FROM ") + .append(UNDO_LOG_TABLE_NAME) + .append(" WHERE branch_id IN "); + appendInParam(xidSize, sqlBuilder); + sqlBuilder.append(" AND xid IN "); + appendInParam(branchIdSize, sqlBuilder); + sqlBuilder.append(" LIMIT ").append(limitSize); + return sqlBuilder.toString(); + } + + protected static void appendInParam(int size, StringBuilder sqlBuilder) { + sqlBuilder.append(" ("); + for (int i = 0;i < size;i++) { + sqlBuilder.append("?"); + if (i < (size - 1)) { + sqlBuilder.append(","); + } + } + sqlBuilder.append(") "); } /** @@ -200,4 +286,41 @@ public static void deleteUndoLog(String xid, long branchId, Connection conn) thr deletePST.setString(2, xid); deletePST.executeUpdate(); } + + private static void insertUndoLogWithNormal(String xid, long branchID, + String undoLogContent, Connection conn) throws SQLException { + insertUndoLog(xid, branchID, undoLogContent, State.Normal, conn); + } + + private static void insertUndoLogWithGlobalFinished(String xid, long branchID, + Connection conn) throws SQLException { + insertUndoLog(xid, branchID, "{}", State.GlobalFinished, conn); + } + + private static void insertUndoLog(String xid, long branchID, + String undoLogContent, State state, Connection conn) throws SQLException { + PreparedStatement pst = null; + try { + pst = conn.prepareStatement(INSERT_UNDO_LOG_SQL); + pst.setLong(1, branchID); + pst.setString(2, xid); + ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent.getBytes()); + pst.setBlob(3,inputStream); + pst.executeUpdate(); + } catch (Exception e) { + if (e instanceof SQLException) { + throw (SQLException)e; + } else { + throw new SQLException(e); + } + } finally { + if (pst != null) { + pst.close(); + } + } + } + + private static boolean canUndo(int state) { + return state == State.Normal.getValue(); + } } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java index 0a573aed58f..fa86ee68cc0 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoDeleteExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,19 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.undo.oracle; +package io.seata.rm.datasource.undo.oracle; import com.alibaba.druid.util.JdbcConstants; -import com.alibaba.fescar.common.exception.ShouldNeverHappenException; -import com.alibaba.fescar.rm.datasource.sql.struct.Field; -import com.alibaba.fescar.rm.datasource.sql.struct.KeyType; -import com.alibaba.fescar.rm.datasource.sql.struct.Row; -import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; -import com.alibaba.fescar.rm.datasource.undo.AbstractUndoExecutor; -import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; -import com.alibaba.fescar.rm.datasource.undo.KeywordCheckerFactory; -import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; +import io.seata.common.exception.ShouldNeverHappenException; +import io.seata.rm.datasource.sql.struct.Field; +import io.seata.rm.datasource.sql.struct.KeyType; +import io.seata.rm.datasource.sql.struct.Row; +import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.undo.AbstractUndoExecutor; +import io.seata.rm.datasource.undo.KeywordChecker; +import io.seata.rm.datasource.undo.KeywordCheckerFactory; +import io.seata.rm.datasource.undo.SQLUndoLog; import java.util.List; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java index 6f8ebc37dc3..4bd41b9c72c 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoInsertExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,19 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.undo.oracle; +package io.seata.rm.datasource.undo.oracle; import com.alibaba.druid.util.JdbcConstants; -import com.alibaba.fescar.common.exception.ShouldNeverHappenException; -import com.alibaba.fescar.rm.datasource.sql.struct.Field; -import com.alibaba.fescar.rm.datasource.sql.struct.KeyType; -import com.alibaba.fescar.rm.datasource.sql.struct.Row; -import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; -import com.alibaba.fescar.rm.datasource.undo.AbstractUndoExecutor; -import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; -import com.alibaba.fescar.rm.datasource.undo.KeywordCheckerFactory; -import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; +import io.seata.common.exception.ShouldNeverHappenException; +import io.seata.rm.datasource.sql.struct.Field; +import io.seata.rm.datasource.sql.struct.KeyType; +import io.seata.rm.datasource.sql.struct.Row; +import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.undo.AbstractUndoExecutor; +import io.seata.rm.datasource.undo.KeywordChecker; +import io.seata.rm.datasource.undo.KeywordCheckerFactory; +import io.seata.rm.datasource.undo.SQLUndoLog; import java.sql.PreparedStatement; import java.sql.SQLException; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java index 5caaf07f641..7c6543e1ef1 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/OracleUndoUpdateExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,19 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package com.alibaba.fescar.rm.datasource.undo.oracle; +package io.seata.rm.datasource.undo.oracle; import com.alibaba.druid.util.JdbcConstants; -import com.alibaba.fescar.common.exception.ShouldNeverHappenException; -import com.alibaba.fescar.rm.datasource.sql.struct.Field; -import com.alibaba.fescar.rm.datasource.sql.struct.KeyType; -import com.alibaba.fescar.rm.datasource.sql.struct.Row; -import com.alibaba.fescar.rm.datasource.sql.struct.TableRecords; -import com.alibaba.fescar.rm.datasource.undo.AbstractUndoExecutor; -import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; -import com.alibaba.fescar.rm.datasource.undo.KeywordCheckerFactory; -import com.alibaba.fescar.rm.datasource.undo.SQLUndoLog; +import io.seata.common.exception.ShouldNeverHappenException; +import io.seata.rm.datasource.sql.struct.Field; +import io.seata.rm.datasource.sql.struct.KeyType; +import io.seata.rm.datasource.sql.struct.Row; +import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.undo.AbstractUndoExecutor; +import io.seata.rm.datasource.undo.KeywordChecker; +import io.seata.rm.datasource.undo.KeywordCheckerFactory; +import io.seata.rm.datasource.undo.SQLUndoLog; import java.util.List; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java index 8eece5b073e..c5a79f4e13d 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/oracle/keyword/OracleKeywordChecker.java @@ -1,6 +1,5 @@ - /* - * Copyright 1999-2018 Alibaba Group Holding Ltd. + * Copyright 1999-2019 Seata.io Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package io.seata.rm.datasource.undo.oracle.keyword; -package com.alibaba.fescar.rm.datasource.undo.oracle.keyword; - -import com.alibaba.fescar.rm.datasource.undo.KeywordChecker; +import io.seata.rm.datasource.undo.KeywordChecker; import java.util.Arrays; import java.util.Set; diff --git a/server/src/main/resources/file.conf b/server/src/main/resources/file.conf index 087e15781cf..c6d71d85472 100644 --- a/server/src/main/resources/file.conf +++ b/server/src/main/resources/file.conf @@ -22,7 +22,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.my_test_tx_group = "default" + vgroup_mapping.txServiceGroup = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support From 39bf981f3e53651a068dc11df59edeb08337bf5e Mon Sep 17 00:00:00 2001 From: ccg Date: Fri, 26 Apr 2019 13:24:30 +0800 Subject: [PATCH 10/32] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=B0=8F=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/seata/rm/datasource/undo/UndoExecutorFactory.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java index db00c66d241..b1443909dd2 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoExecutorFactory.java @@ -21,7 +21,9 @@ import io.seata.rm.datasource.undo.mysql.MySQLUndoDeleteExecutor; import io.seata.rm.datasource.undo.mysql.MySQLUndoInsertExecutor; import io.seata.rm.datasource.undo.mysql.MySQLUndoUpdateExecutor; +import io.seata.rm.datasource.undo.oracle.OracleUndoDeleteExecutor; import io.seata.rm.datasource.undo.oracle.OracleUndoInsertExecutor; +import io.seata.rm.datasource.undo.oracle.OracleUndoUpdateExecutor; /** * The type Undo executor factory. @@ -46,9 +48,9 @@ public static AbstractUndoExecutor getUndoExecutor(String dbType, SQLUndoLog sql case INSERT: return new OracleUndoInsertExecutor(sqlUndoLog); case UPDATE: - return new OracleUndoInsertExecutor(sqlUndoLog); + return new OracleUndoUpdateExecutor(sqlUndoLog); case DELETE: - return new OracleUndoInsertExecutor(sqlUndoLog); + return new OracleUndoDeleteExecutor(sqlUndoLog); default: throw new ShouldNeverHappenException(); } From c4f8f3b619f861576dd7d38dc44dda4c7a7bb488 Mon Sep 17 00:00:00 2001 From: ccg Date: Fri, 26 Apr 2019 14:24:57 +0800 Subject: [PATCH 11/32] =?UTF-8?q?=E8=BF=98=E5=8E=9FdistributionManagement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index d36d0e06c70..69d50cc1294 100644 --- a/pom.xml +++ b/pom.xml @@ -125,19 +125,6 @@ 3.0 3.0.0 - - - - releases - Nexus Release Repository - http://192.168.150.59:8081/repository/maven-releases/ - - - snapshots - http://192.168.150.59:8081/repository/maven-snapshots/ - - - @@ -473,15 +460,14 @@ - - releases - Nexus Release Repository - http://192.168.150.59:8081/repository/maven-releases/ - - snapshots - http://192.168.150.59:8081/repository/maven-snapshots/ + oss_seata + https://oss.sonatype.org/content/repositories/snapshots + + oss_seata + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + From aa2a0153b3079b5e2b7d108ea86500d7149d53d2 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Fri, 26 Apr 2019 14:56:49 +0800 Subject: [PATCH 12/32] Update pom.xml --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 69d50cc1294..dc104919c1b 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,6 @@ 0.9.1 1 0.7.6 - true 5.2.0 1.1.0 3.6.0 From b4cace4812f5138966b2a6a714203d8547c97bbd Mon Sep 17 00:00:00 2001 From: ccg Date: Fri, 26 Apr 2019 15:25:37 +0800 Subject: [PATCH 13/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=88=A4=E6=96=AD=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/seata/rm/datasource/AsyncWorker.java | 18 +++++++++++++++--- .../datasource/undo/UndoLogManagerOracle.java | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java index f1400f49aa0..1211bcdde83 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java @@ -15,6 +15,7 @@ */ package io.seata.rm.datasource; +import com.alibaba.druid.util.JdbcConstants; import io.seata.common.exception.NotSupportYetException; import io.seata.common.exception.ShouldNeverHappenException; import io.seata.common.thread.NamedThreadFactory; @@ -28,6 +29,8 @@ import io.seata.rm.datasource.undo.UndoLogManager; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; + +import io.seata.rm.datasource.undo.UndoLogManagerOracle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,10 +161,11 @@ private void doBranchCommits() { for (Map.Entry> entry : mappedContexts.entrySet()) { Connection conn = null; + DataSourceProxy dataSourceProxy; try { try { DataSourceManager resourceManager = (DataSourceManager) DefaultResourceManager.get().getResourceManager(BranchType.AT); - DataSourceProxy dataSourceProxy = resourceManager.get(entry.getKey()); + dataSourceProxy = resourceManager.get(entry.getKey()); if (dataSourceProxy == null) { throw new ShouldNeverHappenException("Failed to find resource on " + entry.getKey()); } @@ -179,7 +183,11 @@ private void doBranchCommits() { int maxSize = xids.size() > branchIds.size() ? xids.size() : branchIds.size(); if(maxSize == UNDOLOG_DELETE_LIMIT_SIZE){ try { - UndoLogManager.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + if(JdbcConstants.ORACLE.equalsIgnoreCase(dataSourceProxy.getDbType())) { + UndoLogManagerOracle.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + } else { + UndoLogManager.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + } } catch (Exception ex) { LOGGER.warn("Failed to batch delete undo log [" + branchIds + "/" + xids + "]", ex); } @@ -193,7 +201,11 @@ private void doBranchCommits() { } try { - UndoLogManager.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + if(JdbcConstants.ORACLE.equalsIgnoreCase(dataSourceProxy.getDbType())) { + UndoLogManagerOracle.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + } else { + UndoLogManager.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + } }catch (Exception ex) { LOGGER.warn("Failed to batch delete undo log [" + branchIds + "/" + xids + "]", ex); } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index 4cbc4bfc9c7..281195aab59 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -257,7 +257,7 @@ protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize,in appendInParam(xidSize, sqlBuilder); sqlBuilder.append(" AND xid IN "); appendInParam(branchIdSize, sqlBuilder); - sqlBuilder.append(" LIMIT ").append(limitSize); +// sqlBuilder.append(" LIMIT ").append(limitSize); return sqlBuilder.toString(); } From 8e5b4befdb10350efb9113d6212bd0c1425e7cdc Mon Sep 17 00:00:00 2001 From: ccg Date: Fri, 26 Apr 2019 16:04:03 +0800 Subject: [PATCH 14/32] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index 281195aab59..66108586772 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -64,7 +64,7 @@ public int getValue() { return value; } } - private static final Logger LOGGER = LoggerFactory.getLogger(UndoLogManager.class); + private static final Logger LOGGER = LoggerFactory.getLogger(UndoLogManagerOracle.class); private static String UNDO_LOG_TABLE_NAME = "undo_log"; private static String INSERT_UNDO_LOG_SQL = "INSERT INTO " + UNDO_LOG_TABLE_NAME + "\n" + From 284d180547a1b01bfd8e4e8a92f27c72b29f47c1 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 13 May 2019 13:35:41 +0800 Subject: [PATCH 15/32] =?UTF-8?q?=E4=BF=AE=E6=94=B9maven=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index dc104919c1b..d36d0e06c70 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,7 @@ 0.9.1 1 0.7.6 + true 5.2.0 1.1.0 3.6.0 @@ -124,6 +125,19 @@ 3.0 3.0.0 + + + + releases + Nexus Release Repository + http://192.168.150.59:8081/repository/maven-releases/ + + + snapshots + http://192.168.150.59:8081/repository/maven-snapshots/ + + + @@ -459,14 +473,15 @@ - - oss_seata - https://oss.sonatype.org/content/repositories/snapshots - - oss_seata - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + releases + Nexus Release Repository + http://192.168.150.59:8081/repository/maven-releases/ + + snapshots + http://192.168.150.59:8081/repository/maven-snapshots/ + From 62dcc61994b22920d33e87ef103e94c2aa612e3b Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 13 May 2019 14:11:58 +0800 Subject: [PATCH 16/32] =?UTF-8?q?=E5=8E=BB=E6=8E=89guava=E9=82=A3=E4=B8=AA?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=9A=84=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seata/rm/datasource/ConnectionProxy.java | 1 + .../sql/struct/TableMetaCacheOracle.java | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java b/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java index a945e8f8399..cb966059fde 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/ConnectionProxy.java @@ -26,6 +26,7 @@ import io.seata.rm.datasource.exec.LockConflictException; import io.seata.rm.datasource.undo.SQLUndoLog; import io.seata.rm.datasource.undo.UndoLogManager; +import io.seata.rm.datasource.undo.UndoLogManagerOracle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java index 8c0293c7b2e..2056d6358c9 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java @@ -31,8 +31,10 @@ import io.seata.rm.datasource.AbstractConnectionProxy; import io.seata.rm.datasource.DataSourceProxy; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.sql.DataSource; @@ -45,9 +47,11 @@ public class TableMetaCacheOracle { private static final long EXPIRE_TIME = 900 * 1000; - private static final Cache TABLE_META_CACHE = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE) + private static final Cache TABLE_META_CACHE = Caffeine.newBuilder().maximumSize(CACHE_SIZE) .expireAfterWrite(EXPIRE_TIME, TimeUnit.MILLISECONDS).softValues().build(); + private static Logger logger = LoggerFactory.getLogger(TableMetaCacheOracle.class); + /** * Gets table meta. * @@ -64,16 +68,14 @@ public static TableMeta getTableMeta(final DataSourceProxy dataSourceProxy, fina TableMeta tmeta = null; final String key = dataSourceKey + "." + tableName; - try { - tmeta = TABLE_META_CACHE.get(key, new Callable() { - @Override - public TableMeta call() throws Exception { - return fetchSchema(dataSourceProxy.getTargetDataSource(), tableName); - } - }); - } catch (ExecutionException e) { - } - + tmeta = TABLE_META_CACHE.get(key, mappingFunction -> { + try { + return fetchSchema(dataSourceProxy.getTargetDataSource(), tableName); + } catch (SQLException e) { + logger.error("get cache error !", e); + return null; + } + }); if (tmeta == null) { try { tmeta = fetchSchema(dataSourceProxy.getTargetDataSource(), tableName); @@ -135,7 +137,7 @@ private static TableMeta resultSetMetaToSchema(java.sql.ResultSet rs2, AbstractC col.setTableName(tableName); col.setColumnName(rs2.getString("COLUMN_NAME")); String datatype = rs2.getString("DATA_TYPE"); - if (StringUtils.equalsIgnoreCase(datatype, "NUMBER")) { + if (com.alibaba.druid.util.StringUtils.equalsIgnoreCase(datatype, "NUMBER")) { col.setDataType(java.sql.Types.BIGINT); } else if (StringUtils.equalsIgnoreCase(datatype, "VARCHAR2")) { col.setDataType(java.sql.Types.VARCHAR); From 8b1d1987e96a6567bc6ac80b79564089844fb307 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 13 May 2019 14:20:15 +0800 Subject: [PATCH 17/32] =?UTF-8?q?=E8=BF=98=E5=8E=9Fpom.xml=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index 674fdedfe93..29570c71822 100644 --- a/pom.xml +++ b/pom.xml @@ -112,7 +112,6 @@ 27.0.1-jre 1 0.7.6 - true 5.2.0 1.1.0 3.6.0 @@ -130,19 +129,6 @@ 1.1.12 2.7.0 - - - - releases - Nexus Release Repository - http://192.168.150.59:8081/repository/maven-releases/ - - - snapshots - http://192.168.150.59:8081/repository/maven-snapshots/ - - - @@ -405,15 +391,14 @@ - - releases - Nexus Release Repository - http://192.168.150.59:8081/repository/maven-releases/ - - snapshots - http://192.168.150.59:8081/repository/maven-snapshots/ + oss_seata + https://oss.sonatype.org/content/repositories/snapshots + + oss_seata + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + From 101bd60992845eaddab18c7cdeae40cb92fe5ea5 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 13 May 2019 17:29:26 +0800 Subject: [PATCH 18/32] =?UTF-8?q?=E8=BF=98=E5=8E=9Ffile.conf=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=92=8C=E5=8E=BB=E6=8E=89import=20=20*=20=20?= =?UTF-8?q?=E8=BF=99=E6=A0=B7=E7=9A=84=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seata/rm/datasource/exec/BaseTransactionalExecutor.java | 6 +++++- server/src/main/resources/file.conf | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java index dd5ed2ffb00..abcc5b7994b 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java @@ -25,7 +25,11 @@ import io.seata.rm.datasource.StatementProxy; import io.seata.rm.datasource.sql.SQLRecognizer; import io.seata.rm.datasource.sql.SQLType; -import io.seata.rm.datasource.sql.struct.*; +import io.seata.rm.datasource.sql.struct.TableMeta; +import io.seata.rm.datasource.sql.struct.TableMetaCache; +import io.seata.rm.datasource.sql.struct.TableMetaCacheOracle; +import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.sql.struct.Field; import io.seata.rm.datasource.undo.SQLUndoLog; /** diff --git a/server/src/main/resources/file.conf b/server/src/main/resources/file.conf index afb0b81e82c..dc908a344ef 100644 --- a/server/src/main/resources/file.conf +++ b/server/src/main/resources/file.conf @@ -22,7 +22,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.txServiceGroup = "default" + vgroup_mapping.my_test_tx_group = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support From 7cc21b97ff8e25516340d8e0ab733a465de9c3e3 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 27 May 2019 10:27:04 +0800 Subject: [PATCH 19/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E5=85=AC=E5=8F=B8=E7=9A=84=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 33 +++++-- .../exec/BaseTransactionalExecutor.java | 11 +++ .../rm/datasource/exec/ExecuteTemplate.java | 61 +++++++++++-- .../exec/noseata/DeleteExecutorNoSeata.java | 70 +++++++++++++++ .../exec/noseata/InsertExecutorNoSeata.java | 89 +++++++++++++++++++ .../rm/datasource/exec/noseata/NoSeata.java | 27 ++++++ .../exec/noseata/UpdateExecutorNoSeata.java | 69 ++++++++++++++ .../seata/rm/datasource/undo/SQLUndoLog.java | 10 +++ .../datasource/undo/UndoLogManagerOracle.java | 82 +++++++++++------ server/src/main/resources/file.conf | 2 +- 10 files changed, 416 insertions(+), 38 deletions(-) create mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java create mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java create mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java create mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java diff --git a/pom.xml b/pom.xml index 29570c71822..cff4f6dc0d7 100644 --- a/pom.xml +++ b/pom.xml @@ -112,6 +112,7 @@ 27.0.1-jre 1 0.7.6 + true 5.2.0 1.1.0 3.6.0 @@ -129,8 +130,27 @@ 1.1.12 2.7.0 + + + + releases + Nexus Release Repository + http://192.168.150.59:8081/repository/maven-releases/ + + + snapshots + http://192.168.150.59:8081/repository/maven-snapshots/ + + + + + co.faao + speed-seata-starter + 6.1.3-SNAPSHOT + provided + org.junit.jupiter junit-jupiter-engine @@ -391,14 +411,15 @@ - - oss_seata - https://oss.sonatype.org/content/repositories/snapshots - - oss_seata - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + releases + Nexus Release Repository + http://192.168.150.59:8081/repository/maven-releases/ + + snapshots + http://192.168.150.59:8081/repository/maven-snapshots/ + diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java index abcc5b7994b..58c978f2a10 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java @@ -19,8 +19,10 @@ import java.sql.Statement; import java.util.List; +import co.faao.plugin.starter.seata.util.ElasticsearchUtil; import com.alibaba.druid.util.JdbcConstants; import io.seata.core.context.RootContext; +import io.seata.rm.datasource.ConnectionContext; import io.seata.rm.datasource.ConnectionProxy; import io.seata.rm.datasource.StatementProxy; import io.seata.rm.datasource.sql.SQLRecognizer; @@ -31,6 +33,7 @@ import io.seata.rm.datasource.sql.struct.TableRecords; import io.seata.rm.datasource.sql.struct.Field; import io.seata.rm.datasource.undo.SQLUndoLog; +import org.apache.commons.lang.time.DateFormatUtils; /** * The type Base transactional executor. @@ -193,6 +196,12 @@ protected void prepareUndoLog(TableRecords beforeImage, TableRecords afterImage) SQLUndoLog sqlUndoLog = buildUndoItem(beforeImage, afterImage); connectionProxy.appendUndoLog(sqlUndoLog); + + //业务数据操作前后插入到es数据库 + ConnectionContext connectionContext = connectionProxy.getContext(); + String xid = connectionContext.getXid(); + ElasticsearchUtil.addData(xid,sqlUndoLog); + } /** @@ -235,6 +244,8 @@ protected SQLUndoLog buildUndoItem(TableRecords beforeImage, TableRecords afterI sqlUndoLog.setTableName(tableName); sqlUndoLog.setBeforeImage(beforeImage); sqlUndoLog.setAfterImage(afterImage); + sqlUndoLog.setExecuteDate(DateFormatUtils.format(new java.util.Date(),"yyyy-MM-dd HH:mm:ss")); + return sqlUndoLog; } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java index 715a38fed9d..784f0ce371d 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java @@ -18,10 +18,17 @@ import java.sql.SQLException; import java.sql.Statement; +import co.faao.plugin.starter.seata.util.ElasticsearchUtil; import io.seata.core.context.RootContext; +import io.seata.rm.datasource.ConnectionContext; import io.seata.rm.datasource.StatementProxy; +import io.seata.rm.datasource.exec.noseata.*; import io.seata.rm.datasource.sql.SQLRecognizer; +import io.seata.rm.datasource.sql.SQLType; import io.seata.rm.datasource.sql.SQLVisitorFactory; +import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.undo.SQLUndoLog; +import org.apache.commons.lang.time.DateFormatUtils; /** * The type Execute template. @@ -65,14 +72,46 @@ public static T execute(SQLRecognizer sqlRecognizer, Object... args) throws SQLException { if (!RootContext.inGlobalTransaction() && !RootContext.requireGlobalLock()) { - // Just work as original statement - return statementCallback.execute(statementProxy.getTargetStatement(), args); + sqlRecognizer = SQLVisitorFactory.get( statementProxy.getTargetSQL(), statementProxy.getConnectionProxy().getDbType()); + if (sqlRecognizer != null) { + NoSeata executor = null; + switch (sqlRecognizer.getSQLType()) { + case INSERT: + executor = new InsertExecutorNoSeata(statementProxy, statementCallback, sqlRecognizer); + break; + case UPDATE: + executor = new UpdateExecutorNoSeata(statementProxy, statementCallback, sqlRecognizer); + break; + case DELETE: + executor = new DeleteExecutorNoSeata(statementProxy, statementCallback, sqlRecognizer); + break; + default: + executor = null; + break; + } + if(executor!=null) { + //保存数据前后镜像 + TableRecords beforeImage = executor.beforeImage(); + T result = statementCallback.execute(statementProxy.getTargetStatement(), args); + TableRecords afterImage = executor.afterImage(beforeImage); + SQLUndoLog sQLUndoLog = buildUndoItem(sqlRecognizer, beforeImage, afterImage); + //业务数据操作前后插入到es数据库 + ConnectionContext connectionContext = statementProxy.getConnectionProxy().getContext(); + String xid = connectionContext.getXid(); + ElasticsearchUtil.addData(xid,sQLUndoLog); + return result; + } else { + // Just work as original statement + return statementCallback.execute(statementProxy.getTargetStatement(), args); + } + } else { + // Just work as original statement + return statementCallback.execute(statementProxy.getTargetStatement(), args); + } } if (sqlRecognizer == null) { - sqlRecognizer = SQLVisitorFactory.get( - statementProxy.getTargetSQL(), - statementProxy.getConnectionProxy().getDbType()); + sqlRecognizer = SQLVisitorFactory.get( statementProxy.getTargetSQL(), statementProxy.getConnectionProxy().getDbType()); } Executor executor = null; if (sqlRecognizer == null) { @@ -108,4 +147,16 @@ public static T execute(SQLRecognizer sqlRecognizer, } return rs; } + + protected static SQLUndoLog buildUndoItem(SQLRecognizer sqlRecognizer,TableRecords beforeImage, TableRecords afterImage) { + SQLType sqlType = sqlRecognizer.getSQLType(); + String tableName = sqlRecognizer.getTableName(); + SQLUndoLog sqlUndoLog = new SQLUndoLog(); + sqlUndoLog.setSqlType(sqlType); + sqlUndoLog.setTableName(tableName); + sqlUndoLog.setBeforeImage(beforeImage); + sqlUndoLog.setAfterImage(afterImage); + sqlUndoLog.setExecuteDate(DateFormatUtils.format(new java.util.Date(),"yyyy-MM-dd HH:mm:ss")); + return sqlUndoLog; + } } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java new file mode 100644 index 00000000000..4b1604f94ad --- /dev/null +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java @@ -0,0 +1,70 @@ +/* + * Copyright 1999-2019 Seata.io Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.seata.rm.datasource.exec.noseata; + +import com.alibaba.druid.util.JdbcConstants; +import io.seata.rm.datasource.ParametersHolder; +import io.seata.rm.datasource.StatementProxy; +import io.seata.rm.datasource.exec.AbstractDMLBaseExecutor; +import io.seata.rm.datasource.exec.DeleteExecutor; +import io.seata.rm.datasource.exec.StatementCallback; +import io.seata.rm.datasource.sql.SQLDeleteRecognizer; +import io.seata.rm.datasource.sql.SQLRecognizer; +import io.seata.rm.datasource.sql.struct.TableMeta; +import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.undo.KeywordChecker; +import io.seata.rm.datasource.undo.KeywordCheckerFactory; +import org.apache.commons.lang.StringUtils; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +/** + * The type Delete executor. + * + * @author sharajava + * + * @param the type parameter + * @param the type parameter + */ +public class DeleteExecutorNoSeata extends DeleteExecutor implements NoSeata{ + + /** + * Instantiates a new Delete executor. + * + * @param statementProxy the statement proxy + * @param statementCallback the statement callback + * @param sqlRecognizer the sql recognizer + */ + public DeleteExecutorNoSeata(StatementProxy statementProxy, StatementCallback statementCallback, + SQLRecognizer sqlRecognizer) { + super(statementProxy, statementCallback, sqlRecognizer); + } + + @Override + public TableRecords beforeImage() throws SQLException { + return super.beforeImage(); + } + + @Override + public TableRecords afterImage(TableRecords beforeImage) throws SQLException { + return super.afterImage(beforeImage); + } +} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java new file mode 100644 index 00000000000..3b408f56104 --- /dev/null +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java @@ -0,0 +1,89 @@ +/* + * Copyright 1999-2019 Seata.io Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.seata.rm.datasource.exec.noseata; + +import io.seata.common.exception.NotSupportYetException; +import io.seata.common.exception.ShouldNeverHappenException; +import io.seata.rm.datasource.PreparedStatementProxy; +import io.seata.rm.datasource.StatementProxy; +import io.seata.rm.datasource.exec.InsertExecutor; +import io.seata.rm.datasource.exec.StatementCallback; +import io.seata.rm.datasource.sql.SQLInsertRecognizer; +import io.seata.rm.datasource.sql.SQLRecognizer; +import io.seata.rm.datasource.sql.struct.ColumnMeta; +import io.seata.rm.datasource.sql.struct.Null; +import io.seata.rm.datasource.sql.struct.TableMeta; +import io.seata.rm.datasource.sql.struct.TableRecords; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * The type Insert executor. + * + * @param the type parameter + * @param the type parameter + * @author yuanguoyao + * @date 2019-03-21 21:30:02 + */ +public class InsertExecutorNoSeata extends InsertExecutor implements NoSeata{ + + + /** + * Instantiates a new Insert executor. + * + * @param statementProxy the statement proxy + * @param statementCallback the statement callback + * @param sqlRecognizer the sql recognizer + */ + public InsertExecutorNoSeata(StatementProxy statementProxy, StatementCallback statementCallback, + SQLRecognizer sqlRecognizer) { + super(statementProxy, statementCallback, sqlRecognizer); + } + + @Override + public TableRecords beforeImage() throws SQLException { + return super.beforeImage(); + } + + @Override + public TableRecords afterImage(TableRecords beforeImage) throws SQLException { + return super.afterImage(beforeImage); + } + + public boolean containsPK() { + + return super.containsPK(); + } + + public List getPkValuesByColumn() throws SQLException { + return super.getPkValuesByColumn(); + } + + + public List getPkValuesByAuto() throws SQLException { + return super.getPkValuesByAuto(); + } + + public TableRecords getTableRecords(List pkValues) throws SQLException { + return super.getTableRecords(pkValues); + } +} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java new file mode 100644 index 00000000000..f48aa0e7012 --- /dev/null +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java @@ -0,0 +1,27 @@ +/* + * Copyright 1999-2019 Seata.io Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.seata.rm.datasource.exec.noseata; + +import io.seata.rm.datasource.sql.struct.TableRecords; + +import java.sql.SQLException; + +public interface NoSeata { + public TableRecords beforeImage() throws SQLException ; + + public TableRecords afterImage(TableRecords beforeImage) throws SQLException ; + +} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java new file mode 100644 index 00000000000..bf10f3efc19 --- /dev/null +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999-2019 Seata.io Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.seata.rm.datasource.exec.noseata; + +import io.seata.rm.datasource.ParametersHolder; +import io.seata.rm.datasource.StatementProxy; +import io.seata.rm.datasource.exec.AbstractDMLBaseExecutor; +import io.seata.rm.datasource.exec.StatementCallback; +import io.seata.rm.datasource.exec.UpdateExecutor; +import io.seata.rm.datasource.sql.SQLRecognizer; +import io.seata.rm.datasource.sql.SQLUpdateRecognizer; +import io.seata.rm.datasource.sql.struct.Field; +import io.seata.rm.datasource.sql.struct.TableMeta; +import io.seata.rm.datasource.sql.struct.TableRecords; +import org.apache.commons.lang.StringUtils; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +/** + * The type Update executor. + * + * @author sharajava + * + * @param the type parameter + * @param the type parameter + */ +public class UpdateExecutorNoSeata extends UpdateExecutor implements NoSeata { + + /** + * Instantiates a new Update executor. + * + * @param statementProxy the statement proxy + * @param statementCallback the statement callback + * @param sqlRecognizer the sql recognizer + */ + public UpdateExecutorNoSeata(StatementProxy statementProxy, StatementCallback statementCallback, + SQLRecognizer sqlRecognizer) { + super(statementProxy, statementCallback, sqlRecognizer); + } + + @Override + public TableRecords beforeImage() throws SQLException { + return super.beforeImage(); + } + + @Override + public TableRecords afterImage(TableRecords beforeImage) throws SQLException { + return super.afterImage(beforeImage); + } + +} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java index 3800bc7691a..5c09686b3f8 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java @@ -34,6 +34,16 @@ public class SQLUndoLog { private TableRecords afterImage; + private String executeDate; + + public String getExecuteDate() { + return executeDate; + } + + public void setExecuteDate(String executeDate) { + this.executeDate = executeDate; + } + /** * Sets table meta. * diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index 66108586772..fd2475a0375 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -19,6 +19,7 @@ import java.sql.*; import java.util.Set; +import co.faao.plugin.starter.seata.util.ElasticsearchUtil; import com.alibaba.druid.util.JdbcConstants; import io.seata.common.exception.NotSupportYetException; import io.seata.common.util.BlobUtils; @@ -69,7 +70,7 @@ public int getValue() { private static String UNDO_LOG_TABLE_NAME = "undo_log"; private static String INSERT_UNDO_LOG_SQL = "INSERT INTO " + UNDO_LOG_TABLE_NAME + "\n" + "\t(id,branch_id, xid, rollback_info, log_status, log_created, log_modified)\n" + - "VALUES (UNDO_LOG_SEQ.nextval,?, ?, ?, 0, sysdate, sysdate)"; + "VALUES (UNDO_LOG_SEQ.nextval,?, ?, ?, ?, sysdate, sysdate)"; private static String DELETE_UNDO_LOG_SQL = "DELETE FROM " + UNDO_LOG_TABLE_NAME + "\n" + "\tWHERE branch_id = ? AND xid = ?"; @@ -179,12 +180,12 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch deleteUndoLog(xid, branchId, conn); conn.commit(); LOGGER.info("xid {} branch {}, undo_log deleted with {}", - xid, branchId, UndoLogManagerOracle.State.GlobalFinished.name()); + xid, branchId, State.GlobalFinished.name()); } else { insertUndoLogWithGlobalFinished(xid, branchId, conn); conn.commit(); LOGGER.info("xid {} branch {}, undo_log added with {}", - xid, branchId, UndoLogManagerOracle.State.GlobalFinished.name()); + xid, branchId, State.GlobalFinished.name()); } return; @@ -220,6 +221,7 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch } } + /** * batch Delete undo log. * @@ -235,18 +237,33 @@ public static void batchDeleteUndoLog(Set xids, Set branchIds, int int xidSize = xids.size(); int branchIdSize = branchIds.size(); String batchDeleteSql = toBatchDeleteUndoLogSql(xidSize, branchIdSize,limitSize); - PreparedStatement deletePST = conn.prepareStatement(batchDeleteSql); - int paramsIndex = 1; - for (Long branchId : branchIds) { - deletePST.setLong(paramsIndex++,branchId); - } - for (String xid: xids){ - deletePST.setString(paramsIndex++, xid); - } - int deleteRows = deletePST.executeUpdate(); - if (LOGGER.isInfoEnabled()) { - LOGGER.info("batch delete undo log size " + deleteRows); + PreparedStatement deletePST = null; + try { + deletePST = conn.prepareStatement(batchDeleteSql); + int paramsIndex = 1; + for (Long branchId : branchIds) { + deletePST.setLong(paramsIndex++,branchId); + } + for (String xid: xids){ + deletePST.setString(paramsIndex++, xid); + } + int deleteRows = deletePST.executeUpdate(); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("batch delete undo log size " + deleteRows); + } + }catch (Exception e){ + if (!(e instanceof SQLException)) { + e = new SQLException(e); + } + throw (SQLException) e; + } finally { + if (deletePST != null) { + deletePST.close(); + } } + + ElasticsearchUtil.deleteData(xids.toArray(new String[xids.size()])); + } protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize,int limitSize) { @@ -254,9 +271,9 @@ protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize,in sqlBuilder.append("DELETE FROM ") .append(UNDO_LOG_TABLE_NAME) .append(" WHERE branch_id IN "); - appendInParam(xidSize, sqlBuilder); - sqlBuilder.append(" AND xid IN "); appendInParam(branchIdSize, sqlBuilder); + sqlBuilder.append(" AND xid IN "); + appendInParam(xidSize, sqlBuilder); // sqlBuilder.append(" LIMIT ").append(limitSize); return sqlBuilder.toString(); } @@ -275,16 +292,29 @@ protected static void appendInParam(int size, StringBuilder sqlBuilder) { /** * Delete undo log. * - * @param xid the xid + * @param xid the xid * @param branchId the branch id - * @param conn the conn + * @param conn the conn * @throws SQLException the sql exception */ public static void deleteUndoLog(String xid, long branchId, Connection conn) throws SQLException { - PreparedStatement deletePST = conn.prepareStatement(DELETE_UNDO_LOG_SQL); - deletePST.setLong(1, branchId); - deletePST.setString(2, xid); - deletePST.executeUpdate(); + PreparedStatement deletePST = null; + try { + deletePST = conn.prepareStatement(DELETE_UNDO_LOG_SQL); + deletePST.setLong(1, branchId); + deletePST.setString(2, xid); + deletePST.executeUpdate(); + }catch (Exception e){ + if (!(e instanceof SQLException)) { + e = new SQLException(e); + } + throw (SQLException) e; + } finally { + if (deletePST != null) { + deletePST.close(); + } + } + ElasticsearchUtil.deleteData(new String[]{xid}); } private static void insertUndoLogWithNormal(String xid, long branchID, @@ -306,13 +336,13 @@ private static void insertUndoLog(String xid, long branchID, pst.setString(2, xid); ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent.getBytes()); pst.setBlob(3,inputStream); + pst.setInt(4, state.getValue()); pst.executeUpdate(); } catch (Exception e) { - if (e instanceof SQLException) { - throw (SQLException)e; - } else { - throw new SQLException(e); + if (!(e instanceof SQLException)) { + e = new SQLException(e); } + throw (SQLException) e; } finally { if (pst != null) { pst.close(); diff --git a/server/src/main/resources/file.conf b/server/src/main/resources/file.conf index dc908a344ef..afb0b81e82c 100644 --- a/server/src/main/resources/file.conf +++ b/server/src/main/resources/file.conf @@ -22,7 +22,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.my_test_tx_group = "default" + vgroup_mapping.txServiceGroup = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support From 6637fc38347a411012d38423b6577b4eef763f6e Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 27 May 2019 10:50:58 +0800 Subject: [PATCH 20/32] Merge branch 'develop' of https://github.com/seata/seata into develop_seata_oracle # Conflicts: # pom.xml # rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java --- pom.xml | 2 +- .../java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index aefd50053ce..43d16b4b615 100644 --- a/pom.xml +++ b/pom.xml @@ -90,7 +90,7 @@ UTF-8 UTF-8 - false + true 0.8.3 1.1.0 2.22.2 diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index fd2475a0375..b079adc8166 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -155,7 +155,7 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch return; } Blob b = rs.getBlob("rollback_info"); - String rollbackInfo = StringUtils.blob2string(b); + String rollbackInfo = BlobUtils.blob2string(b); BranchUndoLog branchUndoLog = UndoLogParserFactory.getInstance().decode(rollbackInfo); for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { From c7d3b4fe91908e95366dc96b516b1be840513a66 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 27 May 2019 10:52:39 +0800 Subject: [PATCH 21/32] =?UTF-8?q?=E5=8E=BB=E6=8E=89import=20=20*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/seata/rm/datasource/undo/UndoLogManagerOracle.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index b079adc8166..09cf9bcb607 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -16,7 +16,12 @@ package io.seata.rm.datasource.undo; import java.io.ByteArrayInputStream; -import java.sql.*; +import java.sql.Blob; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.SQLIntegrityConstraintViolationException; import java.util.Set; import co.faao.plugin.starter.seata.util.ElasticsearchUtil; @@ -24,7 +29,6 @@ import io.seata.common.exception.NotSupportYetException; import io.seata.common.util.BlobUtils; import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; import io.seata.core.exception.TransactionException; import io.seata.rm.datasource.ConnectionContext; import io.seata.rm.datasource.ConnectionProxy; From a3e6347643cedea9a5b577c41e25ec9434ff4342 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 27 May 2019 10:58:26 +0800 Subject: [PATCH 22/32] =?UTF-8?q?=E8=BF=98=E5=8E=9Fpom.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 43d16b4b615..d657ed812a4 100644 --- a/pom.xml +++ b/pom.xml @@ -90,7 +90,7 @@ UTF-8 UTF-8 - true + false 0.8.3 1.1.0 2.22.2 @@ -110,27 +110,8 @@ - - - - releases - Nexus Release Repository - http://192.168.150.59:8081/repository/maven-releases/ - - - snapshots - http://192.168.150.59:8081/repository/maven-snapshots/ - - - - - co.faao - speed-seata-starter - 6.1.3-SNAPSHOT - provided - org.junit.jupiter junit-jupiter-engine @@ -229,17 +210,18 @@ + - - releases - Nexus Release Repository - http://192.168.150.59:8081/repository/maven-releases/ - - snapshots - http://192.168.150.59:8081/repository/maven-snapshots/ + oss_seata + https://oss.sonatype.org/content/repositories/snapshots + + oss_seata + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + From 5a7bd3bb7bd11189b1a94d31c08d51bc6e8a002f Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 27 May 2019 17:23:17 +0800 Subject: [PATCH 23/32] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exec/BaseTransactionalExecutor.java | 24 ++--- .../rm/datasource/exec/ExecuteTemplate.java | 67 ++------------ .../exec/noseata/DeleteExecutorNoSeata.java | 70 --------------- .../exec/noseata/InsertExecutorNoSeata.java | 89 ------------------- .../rm/datasource/exec/noseata/NoSeata.java | 27 ------ .../exec/noseata/UpdateExecutorNoSeata.java | 69 -------------- .../seata/rm/datasource/undo/SQLUndoLog.java | 10 --- .../datasource/undo/UndoLogManagerOracle.java | 3 - 8 files changed, 13 insertions(+), 346 deletions(-) delete mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java delete mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java delete mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java delete mode 100644 rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java index 58c978f2a10..e9cf0410b2c 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java @@ -15,25 +15,18 @@ */ package io.seata.rm.datasource.exec; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; - -import co.faao.plugin.starter.seata.util.ElasticsearchUtil; import com.alibaba.druid.util.JdbcConstants; import io.seata.core.context.RootContext; -import io.seata.rm.datasource.ConnectionContext; import io.seata.rm.datasource.ConnectionProxy; import io.seata.rm.datasource.StatementProxy; import io.seata.rm.datasource.sql.SQLRecognizer; import io.seata.rm.datasource.sql.SQLType; -import io.seata.rm.datasource.sql.struct.TableMeta; -import io.seata.rm.datasource.sql.struct.TableMetaCache; -import io.seata.rm.datasource.sql.struct.TableMetaCacheOracle; -import io.seata.rm.datasource.sql.struct.TableRecords; -import io.seata.rm.datasource.sql.struct.Field; +import io.seata.rm.datasource.sql.struct.*; import io.seata.rm.datasource.undo.SQLUndoLog; -import org.apache.commons.lang.time.DateFormatUtils; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; /** * The type Base transactional executor. @@ -196,12 +189,6 @@ protected void prepareUndoLog(TableRecords beforeImage, TableRecords afterImage) SQLUndoLog sqlUndoLog = buildUndoItem(beforeImage, afterImage); connectionProxy.appendUndoLog(sqlUndoLog); - - //业务数据操作前后插入到es数据库 - ConnectionContext connectionContext = connectionProxy.getContext(); - String xid = connectionContext.getXid(); - ElasticsearchUtil.addData(xid,sqlUndoLog); - } /** @@ -244,7 +231,6 @@ protected SQLUndoLog buildUndoItem(TableRecords beforeImage, TableRecords afterI sqlUndoLog.setTableName(tableName); sqlUndoLog.setBeforeImage(beforeImage); sqlUndoLog.setAfterImage(afterImage); - sqlUndoLog.setExecuteDate(DateFormatUtils.format(new java.util.Date(),"yyyy-MM-dd HH:mm:ss")); return sqlUndoLog; } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java index 784f0ce371d..36b657c18e0 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/ExecuteTemplate.java @@ -15,20 +15,13 @@ */ package io.seata.rm.datasource.exec; -import java.sql.SQLException; -import java.sql.Statement; - -import co.faao.plugin.starter.seata.util.ElasticsearchUtil; import io.seata.core.context.RootContext; -import io.seata.rm.datasource.ConnectionContext; import io.seata.rm.datasource.StatementProxy; -import io.seata.rm.datasource.exec.noseata.*; import io.seata.rm.datasource.sql.SQLRecognizer; -import io.seata.rm.datasource.sql.SQLType; import io.seata.rm.datasource.sql.SQLVisitorFactory; -import io.seata.rm.datasource.sql.struct.TableRecords; -import io.seata.rm.datasource.undo.SQLUndoLog; -import org.apache.commons.lang.time.DateFormatUtils; + +import java.sql.SQLException; +import java.sql.Statement; /** * The type Execute template. @@ -72,46 +65,14 @@ public static T execute(SQLRecognizer sqlRecognizer, Object... args) throws SQLException { if (!RootContext.inGlobalTransaction() && !RootContext.requireGlobalLock()) { - sqlRecognizer = SQLVisitorFactory.get( statementProxy.getTargetSQL(), statementProxy.getConnectionProxy().getDbType()); - if (sqlRecognizer != null) { - NoSeata executor = null; - switch (sqlRecognizer.getSQLType()) { - case INSERT: - executor = new InsertExecutorNoSeata(statementProxy, statementCallback, sqlRecognizer); - break; - case UPDATE: - executor = new UpdateExecutorNoSeata(statementProxy, statementCallback, sqlRecognizer); - break; - case DELETE: - executor = new DeleteExecutorNoSeata(statementProxy, statementCallback, sqlRecognizer); - break; - default: - executor = null; - break; - } - if(executor!=null) { - //保存数据前后镜像 - TableRecords beforeImage = executor.beforeImage(); - T result = statementCallback.execute(statementProxy.getTargetStatement(), args); - TableRecords afterImage = executor.afterImage(beforeImage); - SQLUndoLog sQLUndoLog = buildUndoItem(sqlRecognizer, beforeImage, afterImage); - //业务数据操作前后插入到es数据库 - ConnectionContext connectionContext = statementProxy.getConnectionProxy().getContext(); - String xid = connectionContext.getXid(); - ElasticsearchUtil.addData(xid,sQLUndoLog); - return result; - } else { - // Just work as original statement - return statementCallback.execute(statementProxy.getTargetStatement(), args); - } - } else { - // Just work as original statement - return statementCallback.execute(statementProxy.getTargetStatement(), args); - } + // Just work as original statement + return statementCallback.execute(statementProxy.getTargetStatement(), args); } if (sqlRecognizer == null) { - sqlRecognizer = SQLVisitorFactory.get( statementProxy.getTargetSQL(), statementProxy.getConnectionProxy().getDbType()); + sqlRecognizer = SQLVisitorFactory.get( + statementProxy.getTargetSQL(), + statementProxy.getConnectionProxy().getDbType()); } Executor executor = null; if (sqlRecognizer == null) { @@ -147,16 +108,4 @@ public static T execute(SQLRecognizer sqlRecognizer, } return rs; } - - protected static SQLUndoLog buildUndoItem(SQLRecognizer sqlRecognizer,TableRecords beforeImage, TableRecords afterImage) { - SQLType sqlType = sqlRecognizer.getSQLType(); - String tableName = sqlRecognizer.getTableName(); - SQLUndoLog sqlUndoLog = new SQLUndoLog(); - sqlUndoLog.setSqlType(sqlType); - sqlUndoLog.setTableName(tableName); - sqlUndoLog.setBeforeImage(beforeImage); - sqlUndoLog.setAfterImage(afterImage); - sqlUndoLog.setExecuteDate(DateFormatUtils.format(new java.util.Date(),"yyyy-MM-dd HH:mm:ss")); - return sqlUndoLog; - } } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java deleted file mode 100644 index 4b1604f94ad..00000000000 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/DeleteExecutorNoSeata.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.rm.datasource.exec.noseata; - -import com.alibaba.druid.util.JdbcConstants; -import io.seata.rm.datasource.ParametersHolder; -import io.seata.rm.datasource.StatementProxy; -import io.seata.rm.datasource.exec.AbstractDMLBaseExecutor; -import io.seata.rm.datasource.exec.DeleteExecutor; -import io.seata.rm.datasource.exec.StatementCallback; -import io.seata.rm.datasource.sql.SQLDeleteRecognizer; -import io.seata.rm.datasource.sql.SQLRecognizer; -import io.seata.rm.datasource.sql.struct.TableMeta; -import io.seata.rm.datasource.sql.struct.TableRecords; -import io.seata.rm.datasource.undo.KeywordChecker; -import io.seata.rm.datasource.undo.KeywordCheckerFactory; -import org.apache.commons.lang.StringUtils; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - -/** - * The type Delete executor. - * - * @author sharajava - * - * @param the type parameter - * @param the type parameter - */ -public class DeleteExecutorNoSeata extends DeleteExecutor implements NoSeata{ - - /** - * Instantiates a new Delete executor. - * - * @param statementProxy the statement proxy - * @param statementCallback the statement callback - * @param sqlRecognizer the sql recognizer - */ - public DeleteExecutorNoSeata(StatementProxy statementProxy, StatementCallback statementCallback, - SQLRecognizer sqlRecognizer) { - super(statementProxy, statementCallback, sqlRecognizer); - } - - @Override - public TableRecords beforeImage() throws SQLException { - return super.beforeImage(); - } - - @Override - public TableRecords afterImage(TableRecords beforeImage) throws SQLException { - return super.afterImage(beforeImage); - } -} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java deleted file mode 100644 index 3b408f56104..00000000000 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/InsertExecutorNoSeata.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.rm.datasource.exec.noseata; - -import io.seata.common.exception.NotSupportYetException; -import io.seata.common.exception.ShouldNeverHappenException; -import io.seata.rm.datasource.PreparedStatementProxy; -import io.seata.rm.datasource.StatementProxy; -import io.seata.rm.datasource.exec.InsertExecutor; -import io.seata.rm.datasource.exec.StatementCallback; -import io.seata.rm.datasource.sql.SQLInsertRecognizer; -import io.seata.rm.datasource.sql.SQLRecognizer; -import io.seata.rm.datasource.sql.struct.ColumnMeta; -import io.seata.rm.datasource.sql.struct.Null; -import io.seata.rm.datasource.sql.struct.TableMeta; -import io.seata.rm.datasource.sql.struct.TableRecords; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * The type Insert executor. - * - * @param the type parameter - * @param the type parameter - * @author yuanguoyao - * @date 2019-03-21 21:30:02 - */ -public class InsertExecutorNoSeata extends InsertExecutor implements NoSeata{ - - - /** - * Instantiates a new Insert executor. - * - * @param statementProxy the statement proxy - * @param statementCallback the statement callback - * @param sqlRecognizer the sql recognizer - */ - public InsertExecutorNoSeata(StatementProxy statementProxy, StatementCallback statementCallback, - SQLRecognizer sqlRecognizer) { - super(statementProxy, statementCallback, sqlRecognizer); - } - - @Override - public TableRecords beforeImage() throws SQLException { - return super.beforeImage(); - } - - @Override - public TableRecords afterImage(TableRecords beforeImage) throws SQLException { - return super.afterImage(beforeImage); - } - - public boolean containsPK() { - - return super.containsPK(); - } - - public List getPkValuesByColumn() throws SQLException { - return super.getPkValuesByColumn(); - } - - - public List getPkValuesByAuto() throws SQLException { - return super.getPkValuesByAuto(); - } - - public TableRecords getTableRecords(List pkValues) throws SQLException { - return super.getTableRecords(pkValues); - } -} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java deleted file mode 100644 index f48aa0e7012..00000000000 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/NoSeata.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.rm.datasource.exec.noseata; - -import io.seata.rm.datasource.sql.struct.TableRecords; - -import java.sql.SQLException; - -public interface NoSeata { - public TableRecords beforeImage() throws SQLException ; - - public TableRecords afterImage(TableRecords beforeImage) throws SQLException ; - -} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java deleted file mode 100644 index bf10f3efc19..00000000000 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/noseata/UpdateExecutorNoSeata.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.rm.datasource.exec.noseata; - -import io.seata.rm.datasource.ParametersHolder; -import io.seata.rm.datasource.StatementProxy; -import io.seata.rm.datasource.exec.AbstractDMLBaseExecutor; -import io.seata.rm.datasource.exec.StatementCallback; -import io.seata.rm.datasource.exec.UpdateExecutor; -import io.seata.rm.datasource.sql.SQLRecognizer; -import io.seata.rm.datasource.sql.SQLUpdateRecognizer; -import io.seata.rm.datasource.sql.struct.Field; -import io.seata.rm.datasource.sql.struct.TableMeta; -import io.seata.rm.datasource.sql.struct.TableRecords; -import org.apache.commons.lang.StringUtils; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - -/** - * The type Update executor. - * - * @author sharajava - * - * @param the type parameter - * @param the type parameter - */ -public class UpdateExecutorNoSeata extends UpdateExecutor implements NoSeata { - - /** - * Instantiates a new Update executor. - * - * @param statementProxy the statement proxy - * @param statementCallback the statement callback - * @param sqlRecognizer the sql recognizer - */ - public UpdateExecutorNoSeata(StatementProxy statementProxy, StatementCallback statementCallback, - SQLRecognizer sqlRecognizer) { - super(statementProxy, statementCallback, sqlRecognizer); - } - - @Override - public TableRecords beforeImage() throws SQLException { - return super.beforeImage(); - } - - @Override - public TableRecords afterImage(TableRecords beforeImage) throws SQLException { - return super.afterImage(beforeImage); - } - -} diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java index 5c09686b3f8..3800bc7691a 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/SQLUndoLog.java @@ -34,16 +34,6 @@ public class SQLUndoLog { private TableRecords afterImage; - private String executeDate; - - public String getExecuteDate() { - return executeDate; - } - - public void setExecuteDate(String executeDate) { - this.executeDate = executeDate; - } - /** * Sets table meta. * diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index 09cf9bcb607..113b5fb3a7c 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -24,7 +24,6 @@ import java.sql.SQLIntegrityConstraintViolationException; import java.util.Set; -import co.faao.plugin.starter.seata.util.ElasticsearchUtil; import com.alibaba.druid.util.JdbcConstants; import io.seata.common.exception.NotSupportYetException; import io.seata.common.util.BlobUtils; @@ -266,7 +265,6 @@ public static void batchDeleteUndoLog(Set xids, Set branchIds, int } } - ElasticsearchUtil.deleteData(xids.toArray(new String[xids.size()])); } @@ -318,7 +316,6 @@ public static void deleteUndoLog(String xid, long branchId, Connection conn) thr deletePST.close(); } } - ElasticsearchUtil.deleteData(new String[]{xid}); } private static void insertUndoLogWithNormal(String xid, long branchID, From bf4682ef9bcdf78a87cdda16ddf18a50e3f4dff7 Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 29 May 2019 17:06:17 +0800 Subject: [PATCH 24/32] =?UTF-8?q?=E5=90=88=E5=B9=B6seata=200.6.0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/seata/rm/datasource/AsyncWorker.java | 8 ++-- .../datasource/undo/UndoLogManagerOracle.java | 37 +++++++++---------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java b/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java index 91d3f3557b4..5499fc02b01 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/AsyncWorker.java @@ -103,7 +103,7 @@ public Phase2Context(BranchType branchType, String xid, long branchId, String re } private static int ASYNC_COMMIT_BUFFER_LIMIT = ConfigurationFactory.getInstance().getInt( - CLIENT_ASYNC_COMMIT_BUFFER_LIMIT, 10000); + CLIENT_ASYNC_COMMIT_BUFFER_LIMIT, 10000); private static final BlockingQueue ASYNC_COMMIT_BUFFER = new LinkedBlockingQueue<>(ASYNC_COMMIT_BUFFER_LIMIT); @@ -124,7 +124,7 @@ public BranchStatus branchCommit(BranchType branchType, String xid, long branchI public synchronized void init() { LOGGER.info("Async Commit Buffer Limit: " + ASYNC_COMMIT_BUFFER_LIMIT); timerExecutor = new ScheduledThreadPoolExecutor(1, - new NamedThreadFactory("AsyncWorker", 1, true)); + new NamedThreadFactory("AsyncWorker", 1, true)); timerExecutor.scheduleAtFixedRate(new Runnable() { @Override public void run() { @@ -182,7 +182,7 @@ private void doBranchCommits() { if(maxSize == UNDOLOG_DELETE_LIMIT_SIZE){ try { if(JdbcConstants.ORACLE.equalsIgnoreCase(dataSourceProxy.getDbType())) { - UndoLogManagerOracle.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + UndoLogManagerOracle.batchDeleteUndoLog(xids, branchIds, conn); } else { UndoLogManager.batchDeleteUndoLog(xids, branchIds, conn); } @@ -200,7 +200,7 @@ private void doBranchCommits() { try { if(JdbcConstants.ORACLE.equalsIgnoreCase(dataSourceProxy.getDbType())) { - UndoLogManagerOracle.batchDeleteUndoLog(xids, branchIds, UNDOLOG_DELETE_LIMIT_SIZE, conn); + UndoLogManagerOracle.batchDeleteUndoLog(xids, branchIds, conn); } else { UndoLogManager.batchDeleteUndoLog(xids, branchIds, conn); } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index 113b5fb3a7c..b7cc4ee8c7a 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -25,6 +25,7 @@ import java.util.Set; import com.alibaba.druid.util.JdbcConstants; +import io.seata.common.Constants; import io.seata.common.exception.NotSupportYetException; import io.seata.common.util.BlobUtils; import io.seata.common.util.CollectionUtils; @@ -72,13 +73,13 @@ public int getValue() { private static String UNDO_LOG_TABLE_NAME = "undo_log"; private static String INSERT_UNDO_LOG_SQL = "INSERT INTO " + UNDO_LOG_TABLE_NAME + "\n" + - "\t(id,branch_id, xid, rollback_info, log_status, log_created, log_modified)\n" + - "VALUES (UNDO_LOG_SEQ.nextval,?, ?, ?, ?, sysdate, sysdate)"; + "\t(id,branch_id, xid, rollback_info, log_status, log_created, log_modified)\n" + + "VALUES (UNDO_LOG_SEQ.nextval,?, ?, ?, ?, sysdate, sysdate)"; private static String DELETE_UNDO_LOG_SQL = "DELETE FROM " + UNDO_LOG_TABLE_NAME + "\n" + - "\tWHERE branch_id = ? AND xid = ?"; + "\tWHERE branch_id = ? AND xid = ?"; private static String SELECT_UNDO_LOG_SQL = "SELECT * FROM " + UNDO_LOG_TABLE_NAME - + " WHERE log_status = 0 AND branch_id = ? AND xid = ? FOR UPDATE"; + + " WHERE log_status = 0 AND branch_id = ? AND xid = ? FOR UPDATE"; private UndoLogManagerOracle() { @@ -102,14 +103,13 @@ public static void flushUndoLogs(ConnectionProxy cp) throws SQLException { branchUndoLog.setBranchId(branchID); branchUndoLog.setSqlUndoLogs(connectionContext.getUndoItems()); - String undoLogContent = UndoLogParserFactory.getInstance().encode(branchUndoLog); + byte[] undoLogContent = UndoLogParserFactory.getInstance().encode(branchUndoLog); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Flushing UNDO LOG: " + undoLogContent); + LOGGER.debug("Flushing UNDO LOG: {}",new String(undoLogContent, Constants.DEFAULT_CHARSET)); } - insertUndoLogWithNormal(xid,branchID,undoLogContent,cp.getTargetConnection()); - + insertUndoLogWithNormal(xid, branchID, undoLogContent, cp.getTargetConnection()); } private static void assertDbSupport(String dbType) { @@ -157,8 +157,9 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch xid, branchId, state); return; } + Blob b = rs.getBlob("rollback_info"); - String rollbackInfo = BlobUtils.blob2string(b); + byte[] rollbackInfo = BlobUtils.blob2Bytes(b); BranchUndoLog branchUndoLog = UndoLogParserFactory.getInstance().decode(rollbackInfo); for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { @@ -233,13 +234,13 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch * @param limitSize * @param conn */ - public static void batchDeleteUndoLog(Set xids, Set branchIds, int limitSize, Connection conn) throws SQLException { + public static void batchDeleteUndoLog(Set xids, Set branchIds, Connection conn) throws SQLException { if (CollectionUtils.isEmpty(xids) || CollectionUtils.isEmpty(branchIds)) { return; } int xidSize = xids.size(); int branchIdSize = branchIds.size(); - String batchDeleteSql = toBatchDeleteUndoLogSql(xidSize, branchIdSize,limitSize); + String batchDeleteSql = toBatchDeleteUndoLogSql(xidSize, branchIdSize); PreparedStatement deletePST = null; try { deletePST = conn.prepareStatement(batchDeleteSql); @@ -265,10 +266,9 @@ public static void batchDeleteUndoLog(Set xids, Set branchIds, int } } - } - protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize,int limitSize) { + protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize) { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("DELETE FROM ") .append(UNDO_LOG_TABLE_NAME) @@ -276,7 +276,6 @@ protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize,in appendInParam(branchIdSize, sqlBuilder); sqlBuilder.append(" AND xid IN "); appendInParam(xidSize, sqlBuilder); -// sqlBuilder.append(" LIMIT ").append(limitSize); return sqlBuilder.toString(); } @@ -319,24 +318,24 @@ public static void deleteUndoLog(String xid, long branchId, Connection conn) thr } private static void insertUndoLogWithNormal(String xid, long branchID, - String undoLogContent, Connection conn) throws SQLException { + byte[] undoLogContent, Connection conn) throws SQLException { insertUndoLog(xid, branchID, undoLogContent, State.Normal, conn); } private static void insertUndoLogWithGlobalFinished(String xid, long branchID, Connection conn) throws SQLException { - insertUndoLog(xid, branchID, "{}", State.GlobalFinished, conn); + insertUndoLog(xid, branchID, "{}".getBytes(Constants.DEFAULT_CHARSET), State.GlobalFinished, conn); } private static void insertUndoLog(String xid, long branchID, - String undoLogContent, State state, Connection conn) throws SQLException { + byte[] undoLogContent, State state, Connection conn) throws SQLException { PreparedStatement pst = null; try { pst = conn.prepareStatement(INSERT_UNDO_LOG_SQL); pst.setLong(1, branchID); pst.setString(2, xid); - ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent.getBytes()); - pst.setBlob(3,inputStream); + ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent); + pst.setBlob(3, inputStream); pst.setInt(4, state.getValue()); pst.executeUpdate(); } catch (Exception e) { From 286edee66afe3072412733f95f7f6bb5ffdc09f6 Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 24 Jul 2019 12:37:37 +0800 Subject: [PATCH 25/32] =?UTF-8?q?=E8=A7=A3=E5=86=B3BaseTransactionalExecut?= =?UTF-8?q?or=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exec/BaseTransactionalExecutor.java | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java index e9cf0410b2c..c7fd9c9b9c8 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/BaseTransactionalExecutor.java @@ -15,18 +15,24 @@ */ package io.seata.rm.datasource.exec; -import com.alibaba.druid.util.JdbcConstants; import io.seata.core.context.RootContext; import io.seata.rm.datasource.ConnectionProxy; import io.seata.rm.datasource.StatementProxy; import io.seata.rm.datasource.sql.SQLRecognizer; import io.seata.rm.datasource.sql.SQLType; -import io.seata.rm.datasource.sql.struct.*; +import io.seata.rm.datasource.sql.struct.Field; +import io.seata.rm.datasource.sql.struct.TableMeta; +import io.seata.rm.datasource.sql.struct.TableMetaCache; +import io.seata.rm.datasource.sql.struct.TableRecords; import io.seata.rm.datasource.undo.SQLUndoLog; import java.sql.SQLException; import java.sql.Statement; import java.util.List; +import java.util.StringJoiner; + +import com.alibaba.druid.util.JdbcConstants; +import io.seata.rm.datasource.sql.struct.TableMetaCacheOracle; /** * The type Base transactional executor. @@ -101,15 +107,12 @@ public Object execute(Object... args) throws Throwable { * @throws SQLException the sql exception */ protected String buildWhereConditionByPKs(List pkRows) throws SQLException { - StringBuffer whereConditionAppender = new StringBuffer(); - for (int i = 0; i < pkRows.size(); i++) { - Field field = pkRows.get(i); - whereConditionAppender.append(getColumnNameInSQL(field.getName()) + " = ?"); - if (i < (pkRows.size() - 1)) { - whereConditionAppender.append(" OR "); - } + StringJoiner whereConditionAppender = new StringJoiner(" OR "); + for (Field field : pkRows) { + whereConditionAppender.add(getColumnNameInSQL(field.getName()) + " = ?"); } return whereConditionAppender.toString(); + } /** @@ -120,11 +123,7 @@ protected String buildWhereConditionByPKs(List pkRows) throws SQLExceptio */ protected String getColumnNameInSQL(String columnName) { String tableAlias = sqlRecognizer.getTableAlias(); - if (tableAlias == null) { - return columnName; - } else { - return tableAlias + "." + columnName; - } + return tableAlias == null ? columnName : tableAlias + "." + columnName; } /** @@ -135,11 +134,7 @@ protected String getColumnNameInSQL(String columnName) { protected String getFromTableInSQL() { String tableName = sqlRecognizer.getTableName(); String tableAlias = sqlRecognizer.getTableAlias(); - if (tableAlias == null) { - return tableName; - } else { - return tableName + " " + tableAlias; - } + return tableAlias == null ? tableName : tableName + " " + tableAlias; } /** @@ -231,7 +226,6 @@ protected SQLUndoLog buildUndoItem(TableRecords beforeImage, TableRecords afterI sqlUndoLog.setTableName(tableName); sqlUndoLog.setBeforeImage(beforeImage); sqlUndoLog.setAfterImage(afterImage); - return sqlUndoLog; } From b31c4f70895ee96d4d2da1e5a01c0b88ed488333 Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 24 Jul 2019 12:42:28 +0800 Subject: [PATCH 26/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0oracle=E5=88=9B?= =?UTF-8?q?=E5=BB=BAundo=E8=A1=A8=E7=9A=84sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index a1cf0a9f8dd..aea2bf4274c 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,43 @@ [![maven](https://img.shields.io/maven-central/v/io.seata/seata-parent.svg)](https://search.maven.org/search?q=io.seata) [![](https://img.shields.io/twitter/follow/seataio.svg?label=Follow&style=social&logoWidth=0)](https://twitter.com/intent/follow?screen_name=seataio) + ## What is Seata? A **distributed transaction solution** with high performance and ease of use for **microservices** architecture. +## oracle sql +``` +-- Create table +create table UNDO_LOG +( + id NUMBER(20) not null, + branch_id NUMBER(20) not null, + xid VARCHAR2(100) not null, + rollback_info BLOB, + log_status INTEGER, + log_created DATE, + log_modified DATE, + ext VARCHAR2(100) +); + +-- Create/Recreate indexes +create index IDX_XRID on UNDO_LOG (BRANCH_ID, XID); + +-- Create/Recreate primary, unique and foreign key constraints +alter table UNDO_LOG + add constraint PK_UNDO primary key (ID); + + + +create sequence UNDO_LOG_SEQ +minvalue 1 +maxvalue 9999999999999999999999999 +start with 1 +increment by 1 +cache 20; + +``` ### Distributed Transaction Problem in Microservices Let's imagine a traditional monolithic application. Its business is built up with 3 modules. They use a single local data source. From 5b8c547c9b9e1cd9a655e2610d64351528259821 Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 24 Jul 2019 18:16:34 +0800 Subject: [PATCH 27/32] =?UTF-8?q?=E5=A2=9E=E5=8A=A0oracle=20=20undo?= =?UTF-8?q?=E8=A1=A8=E5=A2=9E=E5=8A=A0context=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/undo/UndoLogManagerOracle.java | 109 ++++++++++++------ 1 file changed, 75 insertions(+), 34 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java index b7cc4ee8c7a..e3cb023fc3f 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/UndoLogManagerOracle.java @@ -22,6 +22,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLIntegrityConstraintViolationException; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import com.alibaba.druid.util.JdbcConstants; @@ -73,13 +75,16 @@ public int getValue() { private static String UNDO_LOG_TABLE_NAME = "undo_log"; private static String INSERT_UNDO_LOG_SQL = "INSERT INTO " + UNDO_LOG_TABLE_NAME + "\n" + - "\t(id,branch_id, xid, rollback_info, log_status, log_created, log_modified)\n" + - "VALUES (UNDO_LOG_SEQ.nextval,?, ?, ?, ?, sysdate, sysdate)"; + "\t(id,branch_id, xid,context, rollback_info, log_status, log_created, log_modified)\n" + + "VALUES (UNDO_LOG_SEQ.nextval,?, ?,?, ?, ?, sysdate, sysdate)"; + private static String DELETE_UNDO_LOG_SQL = "DELETE FROM " + UNDO_LOG_TABLE_NAME + "\n" + - "\tWHERE branch_id = ? AND xid = ?"; + "\tWHERE branch_id = ? AND xid = ?"; private static String SELECT_UNDO_LOG_SQL = "SELECT * FROM " + UNDO_LOG_TABLE_NAME - + " WHERE log_status = 0 AND branch_id = ? AND xid = ? FOR UPDATE"; + + " WHERE branch_id = ? AND xid = ? FOR UPDATE"; + + private static final ThreadLocal SERIALIZER_LOCAL = new ThreadLocal<>(); private UndoLogManagerOracle() { @@ -103,13 +108,14 @@ public static void flushUndoLogs(ConnectionProxy cp) throws SQLException { branchUndoLog.setBranchId(branchID); branchUndoLog.setSqlUndoLogs(connectionContext.getUndoItems()); - byte[] undoLogContent = UndoLogParserFactory.getInstance().encode(branchUndoLog); + UndoLogParser parser = UndoLogParserFactory.getInstance(); + byte[] undoLogContent = parser.encode(branchUndoLog); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Flushing UNDO LOG: {}",new String(undoLogContent, Constants.DEFAULT_CHARSET)); } - insertUndoLogWithNormal(xid, branchID, undoLogContent, cp.getTargetConnection()); + insertUndoLogWithNormal(xid, branchID,buildContext(parser.getName()), undoLogContent, cp.getTargetConnection()); } private static void assertDbSupport(String dbType) { @@ -153,23 +159,38 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch // ensuring that only the undo_log in the normal state is processed. int state = rs.getInt("log_status"); if (!canUndo(state)) { - LOGGER.info("xid {} branch {}, ignore {} undo_log", + if (LOGGER.isInfoEnabled()) { + LOGGER.info("xid {} branch {}, ignore {} undo_log", xid, branchId, state); + } return; } + String contextString = rs.getString("context"); + Map context = parseContext(contextString); Blob b = rs.getBlob("rollback_info"); byte[] rollbackInfo = BlobUtils.blob2Bytes(b); - BranchUndoLog branchUndoLog = UndoLogParserFactory.getInstance().decode(rollbackInfo); - - for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { - TableMeta tableMeta = TableMetaCacheOracle.getTableMeta(dataSourceProxy, sqlUndoLog.getTableName()); - sqlUndoLog.setTableMeta(tableMeta); - AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(dataSourceProxy.getDbType(), - sqlUndoLog); - undoExecutor.executeOn(conn); - } + String serializer = context == null ? null : context.get(UndoLogConstants.SERIALIZER_KEY); + UndoLogParser parser = serializer == null ? UndoLogParserFactory.getInstance() : + UndoLogParserFactory.getInstance(serializer); + BranchUndoLog branchUndoLog = parser.decode(rollbackInfo); + + try { + // put serializer name to local + SERIALIZER_LOCAL.set(parser.getName()); + + for (SQLUndoLog sqlUndoLog : branchUndoLog.getSqlUndoLogs()) { + TableMeta tableMeta = TableMetaCacheOracle.getTableMeta(dataSourceProxy, sqlUndoLog.getTableName()); + sqlUndoLog.setTableMeta(tableMeta); + AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(dataSourceProxy.getDbType(), + sqlUndoLog); + undoExecutor.executeOn(conn); + } + } finally { + // remove serializer name + SERIALIZER_LOCAL.remove(); + } } // If undo_log exists, it means that the branch transaction has completed the first phase, // we can directly roll back and clean the undo_log @@ -183,20 +204,26 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch if (exists) { deleteUndoLog(xid, branchId, conn); conn.commit(); - LOGGER.info("xid {} branch {}, undo_log deleted with {}", - xid, branchId, State.GlobalFinished.name()); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("xid {} branch {}, undo_log deleted with {}", + xid, branchId, State.GlobalFinished.name()); + } } else { - insertUndoLogWithGlobalFinished(xid, branchId, conn); + insertUndoLogWithGlobalFinished(xid, branchId, UndoLogParserFactory.getInstance(), conn); conn.commit(); - LOGGER.info("xid {} branch {}, undo_log added with {}", - xid, branchId, State.GlobalFinished.name()); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("xid {} branch {}, undo_log added with {}", + xid, branchId, State.GlobalFinished.name()); + } } return; } catch (SQLIntegrityConstraintViolationException e) { // Possible undo_log has been inserted into the database by other processes, retrying rollback undo_log - LOGGER.info("xid {} branch {}, undo_log inserted, retry rollback", - xid, branchId); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("xid {} branch {}, undo_log inserted, retry rollback", + xid, branchId); + } } catch (Throwable e) { if (conn != null) { try { @@ -231,7 +258,6 @@ public static void undo(DataSourceProxy dataSourceProxy, String xid, long branch * * @param xids * @param branchIds - * @param limitSize * @param conn */ public static void batchDeleteUndoLog(Set xids, Set branchIds, Connection conn) throws SQLException { @@ -316,27 +342,31 @@ public static void deleteUndoLog(String xid, long branchId, Connection conn) thr } } } - - private static void insertUndoLogWithNormal(String xid, long branchID, + public static String getCurrentSerializer() { + return SERIALIZER_LOCAL.get(); + } + private static void insertUndoLogWithNormal(String xid, long branchID, String rollbackCtx, byte[] undoLogContent, Connection conn) throws SQLException { - insertUndoLog(xid, branchID, undoLogContent, State.Normal, conn); + insertUndoLog(xid, branchID,rollbackCtx, undoLogContent, State.Normal, conn); } - private static void insertUndoLogWithGlobalFinished(String xid, long branchID, - Connection conn) throws SQLException { - insertUndoLog(xid, branchID, "{}".getBytes(Constants.DEFAULT_CHARSET), State.GlobalFinished, conn); + private static void insertUndoLogWithGlobalFinished(String xid, long branchID, UndoLogParser parser, + Connection conn) throws SQLException { + insertUndoLog(xid, branchID, buildContext(parser.getName()), + parser.getDefaultContent(), State.GlobalFinished, conn); } - private static void insertUndoLog(String xid, long branchID, - byte[] undoLogContent, State state, Connection conn) throws SQLException { + private static void insertUndoLog(String xid, long branchID, String rollbackCtx, + byte[] undoLogContent, State state, Connection conn) throws SQLException { PreparedStatement pst = null; try { pst = conn.prepareStatement(INSERT_UNDO_LOG_SQL); pst.setLong(1, branchID); pst.setString(2, xid); + pst.setString(3, rollbackCtx); ByteArrayInputStream inputStream = new ByteArrayInputStream(undoLogContent); - pst.setBlob(3, inputStream); - pst.setInt(4, state.getValue()); + pst.setBlob(4, inputStream); + pst.setInt(5, state.getValue()); pst.executeUpdate(); } catch (Exception e) { if (!(e instanceof SQLException)) { @@ -353,4 +383,15 @@ private static void insertUndoLog(String xid, long branchID, private static boolean canUndo(int state) { return state == State.Normal.getValue(); } + + private static String buildContext(String serializer) { + Map map = new HashMap<>(); + map.put(UndoLogConstants.SERIALIZER_KEY, serializer); + return CollectionUtils.encodeMap(map); + } + + private static Map parseContext(String data) { + return CollectionUtils.decodeMap(data); + } + } From 6a076b9c75b656ad67876b2b0eb4c5b5b26c1b79 Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 29 Jul 2019 17:50:54 +0800 Subject: [PATCH 28/32] =?UTF-8?q?oracle=E6=94=AF=E6=8C=81=E8=B7=A8?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AE=BF=E9=97=AE=EF=BC=8C=E8=A1=A8=E5=90=8D?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F=E5=86=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rm/datasource/DataSourceManager.java | 5 +- .../sql/struct/TableMetaCacheOracle.java | 151 +++++++++--------- 2 files changed, 81 insertions(+), 75 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java index 608db94dc58..b2aa2cccdb9 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceManager.java @@ -177,8 +177,11 @@ public BranchStatus branchRollback(BranchType branchType, String xid, long branc try { if(JdbcConstants.ORACLE.equalsIgnoreCase(dataSourceProxy.getDbType())) { UndoLogManagerOracle.undo(dataSourceProxy, xid, branchId); - } else { + } + else if(JdbcConstants.MYSQL.equalsIgnoreCase(dataSourceProxy.getDbType())){ UndoLogManager.undo(dataSourceProxy, xid, branchId); + } else { + throw new NotSupportYetException("DbType[" + dataSourceProxy.getDbType() + "] is not support yet!"); } } catch (TransactionException te) { if (LOGGER.isInfoEnabled()){ diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java index 2056d6358c9..1d9b03fab75 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java @@ -101,12 +101,12 @@ private static TableMeta fetchSchemeInDefaultWay(DataSource dataSource, String t try { conn = dataSource.getConnection(); stmt = conn.createStatement(); - StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName ); - rs = stmt.executeQuery(sb.toString()); - ResultSetMetaData rsmd = rs.getMetaData(); +// StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName ); +// StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName +" where 1 = 2" ); +// rs = stmt.executeQuery(sb.toString()); +// ResultSetMetaData rsmd = rs.getMetaData(); DatabaseMetaData dbmd = conn.getMetaData(); - - return resultSetMetaToSchema(rsmd, dbmd, tableName); + return resultSetMetaToSchema(null, dbmd, tableName); } catch (Exception e) { if (e instanceof SQLException) { throw ((SQLException)e); @@ -125,79 +125,82 @@ private static TableMeta fetchSchemeInDefaultWay(DataSource dataSource, String t } } } - - private static TableMeta resultSetMetaToSchema(java.sql.ResultSet rs2, AbstractConnectionProxy conn, - String tablename) throws SQLException { - String tableName = tablename; - - TableMeta tm = new TableMeta(); - tm.setTableName(tableName); - while (rs2.next()) { - ColumnMeta col = new ColumnMeta(); - col.setTableName(tableName); - col.setColumnName(rs2.getString("COLUMN_NAME")); - String datatype = rs2.getString("DATA_TYPE"); - if (com.alibaba.druid.util.StringUtils.equalsIgnoreCase(datatype, "NUMBER")) { - col.setDataType(java.sql.Types.BIGINT); - } else if (StringUtils.equalsIgnoreCase(datatype, "VARCHAR2")) { - col.setDataType(java.sql.Types.VARCHAR); - } else if (StringUtils.equalsIgnoreCase(datatype, "CHAR")) { - col.setDataType(java.sql.Types.CHAR); - } else if (StringUtils.equalsIgnoreCase(datatype, "DATE")) { - col.setDataType(java.sql.Types.DATE); - } - - col.setColumnSize(rs2.getInt("DATA_LENGTH")); - - tm.getAllColumns().put(col.getColumnName(), col); - } - - java.sql.Statement stmt = null; - java.sql.ResultSet rs1 = null; - try { - stmt = conn.getTargetConnection().createStatement(); - rs1 = stmt.executeQuery( - "select a.constraint_name, a.column_name from user_cons_columns a, user_constraints b where a" - + ".constraint_name = b.constraint_name and b.constraint_type = 'P' and a.table_name ='" - + tableName + "'"); - while (rs1.next()) { - String indexName = rs1.getString(1); - String colName = rs1.getString(2); - ColumnMeta col = tm.getAllColumns().get(colName); - - if (tm.getAllIndexes().containsKey(indexName)) { - IndexMeta index = tm.getAllIndexes().get(indexName); - index.getValues().add(col); - } else { - IndexMeta index = new IndexMeta(); - index.setIndexName(indexName); - index.getValues().add(col); - index.setIndextype(IndexType.PRIMARY); - tm.getAllIndexes().put(indexName, index); - - } - } - } finally { - if (rs1 != null) { - rs1.close(); - } - if (stmt != null) { - stmt.close(); - } - } - - return tm; - } +// +// private static TableMeta resultSetMetaToSchema(java.sql.ResultSet rs2, AbstractConnectionProxy conn, +// String tablename) throws SQLException { +// String tableName = tablename; +// +// TableMeta tm = new TableMeta(); +// tm.setTableName(tableName); +// while (rs2.next()) { +// ColumnMeta col = new ColumnMeta(); +// col.setTableName(tableName); +// col.setColumnName(rs2.getString("COLUMN_NAME")); +// String datatype = rs2.getString("DATA_TYPE"); +// if (com.alibaba.druid.util.StringUtils.equalsIgnoreCase(datatype, "NUMBER")) { +// col.setDataType(java.sql.Types.BIGINT); +// } else if (StringUtils.equalsIgnoreCase(datatype, "VARCHAR2")) { +// col.setDataType(java.sql.Types.VARCHAR); +// } else if (StringUtils.equalsIgnoreCase(datatype, "CHAR")) { +// col.setDataType(java.sql.Types.CHAR); +// } else if (StringUtils.equalsIgnoreCase(datatype, "DATE")) { +// col.setDataType(java.sql.Types.DATE); +// } +// +// col.setColumnSize(rs2.getInt("DATA_LENGTH")); +// +// tm.getAllColumns().put(col.getColumnName(), col); +// } +// +// java.sql.Statement stmt = null; +// java.sql.ResultSet rs1 = null; +// try { +// stmt = conn.getTargetConnection().createStatement(); +// rs1 = stmt.executeQuery( +// "select a.constraint_name, a.column_name from user_cons_columns a, user_constraints b where a" +// + ".constraint_name = b.constraint_name and b.constraint_type = 'P' and a.table_name ='" +// + tableName + "'"); +// while (rs1.next()) { +// String indexName = rs1.getString(1); +// String colName = rs1.getString(2); +// ColumnMeta col = tm.getAllColumns().get(colName); +// +// if (tm.getAllIndexes().containsKey(indexName)) { +// IndexMeta index = tm.getAllIndexes().get(indexName); +// index.getValues().add(col); +// } else { +// IndexMeta index = new IndexMeta(); +// index.setIndexName(indexName); +// index.getValues().add(col); +// index.setIndextype(IndexType.PRIMARY); +// tm.getAllIndexes().put(indexName, index); +// +// } +// } +// } finally { +// if (rs1 != null) { +// rs1.close(); +// } +// if (stmt != null) { +// stmt.close(); +// } +// } +// +// return tm; +// } private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseMetaData dbmd, String tableName) throws SQLException { -// String schemaName = rsmd.getSchemaName(1); -// String catalogName = rsmd.getCatalogName(1); - +// String temp = rsmd.getSchemaName(1); + tableName = tableName.toUpperCase();//转换大写,oracle表名要大写才能取元数据 TableMeta tm = new TableMeta(); tm.setTableName(tableName); + String[] schemaTable = tableName.split("\\."); + String schemaName = schemaTable.length>1?schemaTable[0]:dbmd.getUserName(); + tableName = schemaTable.length>1?schemaTable[1]:tableName; - ResultSet rs1 = dbmd.getColumns("", dbmd.getUserName(), tableName, "%"); + ResultSet rs1 = dbmd.getColumns("", schemaName, tableName, "%"); +// ResultSet rs1 = dbmd.getColumns("", dbmd.getUserName(), tableName, "%"); while (rs1.next()) { ColumnMeta col = new ColumnMeta(); col.setTableCat(rs1.getString("TABLE_CAT")); @@ -223,7 +226,7 @@ private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseM } - java.sql.ResultSet rs2 = dbmd.getIndexInfo(null, dbmd.getUserName(), tableName, false, true); + java.sql.ResultSet rs2 = dbmd.getIndexInfo(null, schemaName, tableName, false, true); String indexName = ""; while (rs2.next()) { @@ -260,7 +263,7 @@ private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseM } } - ResultSet pk = dbmd.getPrimaryKeys(null, dbmd.getUserName(), tableName); + ResultSet pk = dbmd.getPrimaryKeys(null, schemaName, tableName); while (pk.next()) { String pkIndexName = pk.getObject(6).toString(); if (tm.getAllIndexes().containsKey(pkIndexName)) { From fa519d5e1dd0acdb39dbf8f2ca1a3824bf6b195b Mon Sep 17 00:00:00 2001 From: ccg Date: Mon, 29 Jul 2019 17:59:07 +0800 Subject: [PATCH 29/32] =?UTF-8?q?=E5=8E=BB=E6=8E=89read.md=E4=B8=AD=20orac?= =?UTF-8?q?le=20sql=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/README.md b/README.md index 1a494221bb2..f233be9d218 100644 --- a/README.md +++ b/README.md @@ -12,39 +12,6 @@ ## What is Seata? A **distributed transaction solution** with high performance and ease of use for **microservices** architecture. -## oracle sql -``` --- Create table -create table UNDO_LOG -( - id NUMBER(20) not null, - branch_id NUMBER(20) not null, - xid VARCHAR2(100) not null, - rollback_info BLOB, - log_status INTEGER, - log_created DATE, - log_modified DATE, - ext VARCHAR2(100) -); - --- Create/Recreate indexes -create index IDX_XRID on UNDO_LOG (BRANCH_ID, XID); - --- Create/Recreate primary, unique and foreign key constraints -alter table UNDO_LOG - add constraint PK_UNDO primary key (ID); - - - - -create sequence UNDO_LOG_SEQ -minvalue 1 -maxvalue 9999999999999999999999999 -start with 1 -increment by 1 -cache 20; - -``` ### Distributed Transaction Problem in Microservices Let's imagine a traditional monolithic application. Its business is built up with 3 modules. They use a single local data source. From a85472e66d3332d7dfcd4f2ed9786d5756e3824d Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 31 Jul 2019 09:27:24 +0800 Subject: [PATCH 30/32] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sql/struct/TableMetaCacheOracle.java | 76 ------------------- 1 file changed, 76 deletions(-) diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java index 1d9b03fab75..84d43ae38ca 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/sql/struct/TableMetaCacheOracle.java @@ -97,14 +97,9 @@ private static TableMeta fetchSchemeInDefaultWay(DataSource dataSource, String t throws SQLException { Connection conn = null; java.sql.Statement stmt = null; - java.sql.ResultSet rs = null; try { conn = dataSource.getConnection(); stmt = conn.createStatement(); -// StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName ); -// StringBuffer sb = new StringBuffer("SELECT * FROM " + tableName +" where 1 = 2" ); -// rs = stmt.executeQuery(sb.toString()); -// ResultSetMetaData rsmd = rs.getMetaData(); DatabaseMetaData dbmd = conn.getMetaData(); return resultSetMetaToSchema(null, dbmd, tableName); } catch (Exception e) { @@ -114,84 +109,14 @@ private static TableMeta fetchSchemeInDefaultWay(DataSource dataSource, String t throw new SQLException("Failed to fetch schema of " + tableName, e); } finally { - if (rs != null) { - rs.close(); - } if (stmt != null) { stmt.close(); } - if (conn != null) { - conn.close(); - } } } -// -// private static TableMeta resultSetMetaToSchema(java.sql.ResultSet rs2, AbstractConnectionProxy conn, -// String tablename) throws SQLException { -// String tableName = tablename; -// -// TableMeta tm = new TableMeta(); -// tm.setTableName(tableName); -// while (rs2.next()) { -// ColumnMeta col = new ColumnMeta(); -// col.setTableName(tableName); -// col.setColumnName(rs2.getString("COLUMN_NAME")); -// String datatype = rs2.getString("DATA_TYPE"); -// if (com.alibaba.druid.util.StringUtils.equalsIgnoreCase(datatype, "NUMBER")) { -// col.setDataType(java.sql.Types.BIGINT); -// } else if (StringUtils.equalsIgnoreCase(datatype, "VARCHAR2")) { -// col.setDataType(java.sql.Types.VARCHAR); -// } else if (StringUtils.equalsIgnoreCase(datatype, "CHAR")) { -// col.setDataType(java.sql.Types.CHAR); -// } else if (StringUtils.equalsIgnoreCase(datatype, "DATE")) { -// col.setDataType(java.sql.Types.DATE); -// } -// -// col.setColumnSize(rs2.getInt("DATA_LENGTH")); -// -// tm.getAllColumns().put(col.getColumnName(), col); -// } -// -// java.sql.Statement stmt = null; -// java.sql.ResultSet rs1 = null; -// try { -// stmt = conn.getTargetConnection().createStatement(); -// rs1 = stmt.executeQuery( -// "select a.constraint_name, a.column_name from user_cons_columns a, user_constraints b where a" -// + ".constraint_name = b.constraint_name and b.constraint_type = 'P' and a.table_name ='" -// + tableName + "'"); -// while (rs1.next()) { -// String indexName = rs1.getString(1); -// String colName = rs1.getString(2); -// ColumnMeta col = tm.getAllColumns().get(colName); -// -// if (tm.getAllIndexes().containsKey(indexName)) { -// IndexMeta index = tm.getAllIndexes().get(indexName); -// index.getValues().add(col); -// } else { -// IndexMeta index = new IndexMeta(); -// index.setIndexName(indexName); -// index.getValues().add(col); -// index.setIndextype(IndexType.PRIMARY); -// tm.getAllIndexes().put(indexName, index); -// -// } -// } -// } finally { -// if (rs1 != null) { -// rs1.close(); -// } -// if (stmt != null) { -// stmt.close(); -// } -// } -// -// return tm; -// } private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseMetaData dbmd, String tableName) throws SQLException { -// String temp = rsmd.getSchemaName(1); tableName = tableName.toUpperCase();//转换大写,oracle表名要大写才能取元数据 TableMeta tm = new TableMeta(); tm.setTableName(tableName); @@ -200,7 +125,6 @@ private static TableMeta resultSetMetaToSchema(ResultSetMetaData rsmd, DatabaseM tableName = schemaTable.length>1?schemaTable[1]:tableName; ResultSet rs1 = dbmd.getColumns("", schemaName, tableName, "%"); -// ResultSet rs1 = dbmd.getColumns("", dbmd.getUserName(), tableName, "%"); while (rs1.next()) { ColumnMeta col = new ColumnMeta(); col.setTableCat(rs1.getString("TABLE_CAT")); From 1d61330ccfc695a21db4df0523287292d2042cb3 Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 31 Jul 2019 09:38:35 +0800 Subject: [PATCH 31/32] =?UTF-8?q?=E8=BF=98=E5=8E=9Ffile.conf=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/file.conf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/main/resources/file.conf b/server/src/main/resources/file.conf index 23091bda645..da6b0dddd5f 100644 --- a/server/src/main/resources/file.conf +++ b/server/src/main/resources/file.conf @@ -28,7 +28,7 @@ transport { } service { #vgroup->rgroup - vgroup_mapping.txServiceGroup = "default" + vgroup_mapping.my_test_tx_group = "default" #only support single node default.grouplist = "127.0.0.1:8091" #degrade current not support @@ -76,7 +76,6 @@ store { datasource = "dbcp" ## mysql/oracle/h2/oceanbase etc. db-type = "mysql" - driver-class-name = "com.mysql.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:3306/seata" user = "mysql" password = "mysql" From 54f9ba975622f008fecf1de314281b60b598951c Mon Sep 17 00:00:00 2001 From: ccg Date: Wed, 31 Jul 2019 10:51:05 +0800 Subject: [PATCH 32/32] =?UTF-8?q?=E8=BF=98=E5=8E=9Ffile.conf=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84driver-class-name=20=3D=20"com.mysql.jdbc.Dri?= =?UTF-8?q?ver"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/file.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/main/resources/file.conf b/server/src/main/resources/file.conf index da6b0dddd5f..a5607c1c092 100644 --- a/server/src/main/resources/file.conf +++ b/server/src/main/resources/file.conf @@ -76,6 +76,7 @@ store { datasource = "dbcp" ## mysql/oracle/h2/oceanbase etc. db-type = "mysql" + driver-class-name = "com.mysql.jdbc.Driver" url = "jdbc:mysql://127.0.0.1:3306/seata" user = "mysql" password = "mysql"