【数据库中间件】分布式组件 - 中间件客户端连接显示表和数据
博客专区 > Fx_demon 的博客 > 博客详情
【数据库中间件】分布式组件 - 中间件客户端连接显示表和数据
Fx_demon 发表于2个月前
【数据库中间件】分布式组件 - 中间件客户端连接显示表和数据
  • 发表于 2个月前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 后端是Oracle数据库 通过中间件连接客户端 展示表和表数据 。

用 Navicat Client 、MySQL 客户端 连接数据库中间件(ClusterDB),中间件连接不显示表名称, 后端数据库是Oracle、DB2等  
    涉及类 : JDBCConnection 主要解决Oracle 表显示    【已解决】 需要完善表显示数据和分片节点 后续迁移到 io.mycat.backend.jdbc.oracle.ShowTables中

修个内容:

private void executeSQL(RouteResultsetNode rrn, ServerConnection sc,
                            boolean autocommit) throws IOException {
        String orgin = rrn.getStatement();
        // String sql = rrn.getStatement().toLowerCase();
         LOGGER.debug("JDBC SQL:"+orgin+"|"+sc.toString());
        if (!modifiedSQLExecuted && rrn.isModifySQL()) {
            modifiedSQLExecuted = true;
        }

        try {
            syncIsolation(sc.getTxIsolation()) ;
            if (!this.schema.equals(this.oldSchema)) {
                con.setCatalog(schema);
                this.oldSchema = schema;
            }
            if (!this.isSpark) {
                con.setAutoCommit(autocommit);
            }
            int sqlType = rrn.getSqlType();
             if( rrn.isCallStatement() && "oracle".equalsIgnoreCase(getDbType()))
             {
                 //存储过程暂时只支持oracle
                 ouputCallStatement(rrn,sc,orgin);
             } else if (sqlType == ServerParse.SELECT || sqlType == ServerParse.SHOW) {
                if( (sqlType == ServerParse.SHOW) && (!dbType.equals("MYSQL")) ) {
                    // showCMD(sc, orgin);
                    //ShowVariables.execute(sc, orgin);
                    boolean showExecute = true;
                    if ("SHOW TABLES".equalsIgnoreCase(orgin)){
                         orgin = "SELECT TABLE_NAME FROM  USER_TABLES" ;
                    } else if ("SHOW FULL TABLES WHERE Table_type != 'VIEW'".equalsIgnoreCase(orgin)){
                         orgin = " SELECT OBJECT_NAME,'BASE TABLE' AS Table_type FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE' ";
                    } else if ("SHOW TABLE STATUS".equalsIgnoreCase(orgin)){
                         StringBuffer sb = new StringBuffer();
                         sb.append(" SELECT  A.TABLE_NAME,A.NUM_ROWS AS \"Rows\",A.LAST_ANALYZED AS Create_time,A.LAST_ANALYZED AS Update_time,");
                         sb.append(" 'InnoDB' AS ENGINE, '' AS Auto_increment ,  B.COMMENTS AS  \"COMMENT\" ");
                         sb.append(" FROM USER_TABLES A, USER_TAB_COMMENTS B WHERE A.TABLE_NAME = B.TABLE_NAME ORDER BY TABLE_NAME ");
                         orgin = sb.toString();
                    } else {
                         showExecute = false;
                    }
                    
                    if( showExecute ){
                        ouputResultSet(sc, orgin);
                    } else {
                        ShowVariables.execute(sc, orgin,this);
                    }    
                } else if ("SELECT CONNECTION_ID()".equalsIgnoreCase(orgin)) {
                    //ShowVariables.justReturnValue(sc,String.valueOf(sc.getId()));
                    ShowVariables.justReturnValue(sc,String.valueOf(sc.getId()),this);
                } else{
                    if("SELECT @@character_set_database, @@collation_database".equalsIgnoreCase(orgin)){
                        orgin = "SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER= 'NLS_CHARACTERSET' ";
                    }
                    ouputResultSet(sc, orgin);
                }
            } else {
                executeddl(sc, orgin);
            }

        } catch (SQLException e) {

            String msg = e.getMessage();
            ErrorPacket error = new ErrorPacket();
            error.packetId = ++packetId;
            error.errno = e.getErrorCode();
            error.message = msg.getBytes();
            this.respHandler.errorResponse(error.writeToBytes(sc), this);
        } catch (Exception e) {
            String msg = e.getMessage();
            ErrorPacket error = new ErrorPacket();
            error.packetId = ++packetId;
            error.errno = ErrorCode.ER_UNKNOWN_ERROR;
            error.message = ((msg == null) ? e.toString().getBytes() : msg.getBytes());
            String err = null;
            if(error.message!=null){
                err = new String(error.message);
            }
            LOGGER.error("sql execute error, "+ err , e);
            this.respHandler.errorResponse(error.writeToBytes(sc), this);
        }
        finally {
            this.running = false;
        }

    }

标签: 数据库中间件
共有 人打赏支持
粉丝 5
博文 31
码字总数 4600
×
Fx_demon
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: