文档章节

【数据库中间件】分布式组件 - 中间件客户端连接显示表和数据

Fx_demon
 Fx_demon
发布于 2017/09/06 08:43
字数 559
阅读 46
收藏 1

最近项目使用分布式数据库中间件 ,后端数据库使用到Oracle ,使用客户端工具连接 ,发现中间件使用JDBC连接方式连接后端数据库为Oracle、SQL Server /DB2等 不显示表名 ,查询数据必须使用SQL命令窗口执行,但是SQL命令窗口执行SQL时,也不提示表名 字段名 、给开发人员和数据库运维人员带来极大的不便,偷窥一下源码 ,也许这个不是最好的解决,欢迎吐槽和转载 。。。

问题:

用 Navicat Client 、MySQL 客户端 连接数据库中间件(MyCat),中间件连接不显示表名称, 后端数据库是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;
        }

    }

 

© 著作权归作者所有

共有 人打赏支持
Fx_demon
粉丝 5
博文 41
码字总数 14025
作品 0
西安
CTO(技术副总裁)
私信 提问
基于Delphi的三层数据库系统的实现方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/4024130 基于Delphi的三层数据库系统的实现方法 摘要随着中间件与Web技术的发展...

rdiframework
2009/03/25
0
0
现在流行这些:dubbo+zookeeper+springmvc+mybatis+shiro+redis+kafka+bootstrap

平台简介 Jeesz是一个分布式的框架,提供项目模块化、服务化、热插拔的思想,高度封装安全性的Java EE快速开发平台。 Jeesz本身集成Dubbo服务管控、Zookeeper注册中心、Redis分布式缓存技术、...

代码潇洒哥
2017/04/17
796
1
【推荐】微服务大型分布式企业框架 dubbo + springmvc + mybatis + ehcache + redis分布式架构

框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件组...

旅行途中
2017/06/14
467
8
SSM组合+ springmvc+mybatis+shiro+restful+bootstrap

平台简介 Jeesz是一个分布式的框架,提供项目模块化、服务化、热插拔的思想,高度封装安全性的Java EE快速开发平台。 Jeesz本身集成Dubbo服务管控、Zookeeper注册中心、Redis分布式缓存技术、...

愉快的鱼儿
2017/06/05
0
0
分布式 dubbo zookeeper springmvc mybatis shiro restful redis fastdfs activemq

摘要: 摘要: SSH ++shiro+restful+bootstrap java架构 java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper j2ee分布式架构 dubbo + springmvc + mybatis + ehcache + redis 分布式架......

qq592fbb5b34ad7
2018/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 孤独到都和病毒发生了感情了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 逃跑计划《一万次悲伤 (Live)》 《一万次悲伤 (Live)》- 逃跑计划 手机党少年们想听歌,请使劲儿戳(这里) 现在...

小小编辑
56分钟前
21
5
test

//// main.c// Test//// Created by 吕颖 on 2019/1/16.// Copyright © 2019年 carmen. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <t......

carmen-ly
今天
3
0
Android webview热门组件agentweb:4.0.2无法自适应的问题

Android webview热门组件agentweb:4.0.2无法自适应的问题 //设置自适应屏幕,两者合用mAgentWeb.getAgentWebSettings().getWebSettings().setUseWideViewPort(true); //将图片调整到适合w...

Gemini-Lin
今天
5
0
如何维护一个自己的 golang doc 服务

本文内容是如何维护一个golang 在线的doc 服务。 1 什么是godoc ? godoc 是 golang 官方提供的文档生成工具, 2 为什么要有godoc ? 我们经常遇到一个问题,就是代码和文档不一致,线上代码版...

鼎铭
今天
5
0
js中的对象创建的模式以及继承模式

对象创建模式: 工厂模式 构造函数模式 原型模式 继承模式 原型式继承 寄生式继承 构造函数 原型式和构造函数的组合式(缺点:运行两次超类类函数,积累函数的属性被挂载在原型对象上和实例对...

莫西摩西
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部