文档章节

级联

放个屁
 放个屁
发布于 2017/07/08 18:10
字数 1339
阅读 17
收藏 0
点赞 0
评论 0

级联,英语:Cascade。是计算机科学里比较常见的概念。通常是指多个对象按照一定的规则有级别地或者是有梯度地联接在一起,也就是按照树形结构有层次地把对象组织在一起。

 

■应用

级联的应用比较广泛,表现在很多方面。

功放,一个功放块或是三极管的放大效果达不到要求的功率,这时候就要用多片级连的方法来实现。

微机原理的8259(中断处理器)是可以级联在一起,从而能处理更多的中断(扩容效果)。

 

网络上的交换机,路由器级联。

级联一般用于扩展网段的设备接入数量和延长距离,如交换机和集线器就是最常见的级联设备。

 

通过这些应用是否对级联有了个初步的形象了呢。

 

在Web项目中也会经常使用到级联的。比如:

货物分类,组织体制结构,行政区划等。

这里以行政区划为例。

数据来源:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/

■表设计

■前端

<!DOCTYPE html>

<html>

<head><title>级联</title>

<style>

.divinline {

display:inline;/* 删除Div的换行*/

}

</style>

</head>

<body>

<div id="area_0" class="divinline"></div>

<script>

window.onload = function() {

    createXmlHttp();

    xmlHttp.open("post", "http://192.168.11.32:8080/teapot/t/?_a=14", true);

    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded" );

    xmlHttp.onreadystatechange = callback;

    xmlHttp.send("owner=" + "area_0");

};

var xmlHttp ;



function createXmlHttp() {

    if(window.ActiveXObject) {

        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

    } else {

        xmlHttp = new XMLHttpRequest();

    }

}



function callback() {

    if(xmlHttp.readyState == 4) {

        if(xmlHttp.status == 200) {

            var json = JSON.parse(xmlHttp.responseText);

            // 得到的数据追加到谁的下面

            var owner = document.getElementById(json.owner);

            if ( json.options.length > 1 ) {

                var div1_old = document.getElementById(json.divid);

                if (div1_old != null) {

                    owner.removeChild(div1_old);

                }

                var div1 = document.createElement("div");

                div1.id=json.divid;

                div1.className="divinline";

                owner.appendChild(div1);

                var sel1 = document.createElement("select");

                for(var i = 0; i < json.options.length; i ++) {

                    var city = json.options[i];

                    var option = new Option(city.cdNm,city.cdVal);

                    sel1.options.add(option);

                };

                sel1.onchange = function() {

                    createXmlHttp();

                    var name = this.value;

                    if(name != "") {

                        xmlHttp.open("post", "http://192.168.11.32:8080/teapot/t/?_a=14", true);

                        xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded" );

                        xmlHttp.onreadystatechange = callback;

                        // 当前owner和值

                        xmlHttp.send("owner=" + json.divid + "&value=" + name);

                    };

                };

                div1.appendChild(sel1);

            }

        }else {

            alert("Ajax Error : " + xmlHttp.status);

        };

    }else {

    };

};

</script>

</body>

</html>

从上面的代码可以看出,html和css部分很简单。

在html里主要使用了div的嵌套。因为使用动态创建,主要处理都在Javascript里了。

Javascript中主要使用了这些计数。Ajax,Json,DOM。回调函数。

对旧的数据删除也是一个小点。

 

■后端

    public void action(HttpServletRequest req, HttpServletResponse resp)

            throws IOException {

        long st1a = System.currentTimeMillis();

        req.setCharacterEncoding("utf-8");

        String owner = (String) req.getAttribute("owner");

        String value = (String) req.getAttribute("value");

        if (value == null) {

            value = "";

        }



        String subDiv = owner;

        int idy = owner.indexOf("_");

        int idx = 0;

        if (idy >= 0) {

            idx = Integer.parseInt(owner.substring(idy + 1));

            subDiv = owner.substring(0, idy) + "_" + (idx + 1);

        } else {

            subDiv = subDiv + "_1";

        }



        String val2 = "";

        if (idx == 0) {

            val2 = "0000000000";

        }

        if (idx == 1) {

            val2 = "00000000";

        }

        if (idx == 2) {

            val2 = "000000";

        }

        if (idx == 3) {

            val2 = "000";

        }



        long ed1 = System.currentTimeMillis();

        log.info("★★★★action 1 耗时" + (ed1 - st1a));

        long st1 = System.currentTimeMillis();

        Connection conn = null;

        Statement stmt = null;

        ResultSet rs = null;

        List<TblCd> cds = new ArrayList<TblCd>();

        try {

            conn = TeapotDb.getConnection();

            stmt = conn.createStatement();

            String sqlCmd = "SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div' ";

            if (value != "" ) {

                sqlCmd = sqlCmd + "AND CD_VAL LIKE '" + value + "%' AND CD_VAL LIKE '%" + val2 + "' ";

            }

            else {

                sqlCmd = sqlCmd + " AND CD_VAL IN ( '110000000000', '120000000000', '130000000000', '140000000000', '150000000000', '210000000000', '220000000000', '230000000000', '310000000000', '320000000000', '330000000000', '340000000000', '350000000000', '360000000000', '370000000000', '410000000000', '420000000000', '430000000000', '440000000000', '450000000000', '460000000000', '500000000000', '510000000000', '520000000000', '530000000000', '540000000000', '610000000000', '620000000000', '630000000000', '640000000000', '650000000000' )";

            }

            sqlCmd = sqlCmd + " ORDER BY CD_VAL;";



            System.out.println("SQL:" + sqlCmd);

            rs = stmt.executeQuery(sqlCmd);

            System.out.println(sqlCmd);

            while (rs.next()) {

                TblCd e = new TblCd();

                if (idx == 0) {

                    e.setCdVal(rs.getString("CD_VAL").substring(0, 2));

                } else if (idx == 1) {

                    e.setCdVal(rs.getString("CD_VAL").substring(0, 4));

                } else  if (idx == 2) {

                    e.setCdVal(rs.getString("CD_VAL").substring(0, 6));

                } else  if (idx == 3) {

                    e.setCdVal(rs.getString("CD_VAL").substring(0, 9));

                } else {

                    e.setCdVal(rs.getString("CD_VAL"));

                }

                e.setCdNm(rs.getString("CD_NM"));

                cds.add(e);

            }

        } catch(Exception e) {

            e.printStackTrace();

            System.out.println(e);

        } finally {

            if (rs != null ) { try {rs.close(); } catch (SQLException e) {e.printStackTrace();} }

            if (stmt != null ) { try {stmt.close(); } catch (SQLException e) {e.printStackTrace();} }

            if (conn != null ) { try {TeapotDb.releaseConnection(conn); } catch (SQLException e) {e.printStackTrace();} }

        }

        ed1 = System.currentTimeMillis();

        log.info("★★★★action 数据库检索 耗时" + (ed1 - st1));

        st1 = System.currentTimeMillis();



        resp.setContentType("application/json;charset=UTF-8");

        resp.setHeader("Access-Control-Allow-Origin", "*");

        PrintWriter out = resp.getWriter();



        Gson gson = new Gson();

        CascadeMdl mdl = new CascadeMdl(owner, subDiv, cds);

        String jsonObject = gson.toJson(mdl);

        System.out.println(jsonObject);

        out.println(jsonObject);

        ed1 = System.currentTimeMillis();

        log.info("★★★★action 3 耗时" + (ed1 - st1) + "总耗时" + (ed1 - st1a));

    }

 

查询数据库,结果以json形式返回。

在获取省列表的时候,有些慢,主要是数据库检索的问题,参照性能测试。

 

■性能测试

在下面这句时表现不好。

SELECT CD_VAL, CD_NM FROM teapot.tbl_cd WHERE CD_TYPE = 'adm_div' AND CD_VAL LIKE '%0000000000' ORDER BY CD_VAL;

发现建表时没有指定主键,那么就先用大招一:为搜索字段建索引。

 

无PRIMARY第一次

SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div' AND CD_VAL LIKE '%0000000000' ORDER BY CD_VAL;

08:59:58.674 [http-nio-8080-exec-4] INFO  o.teapot.servlet.controller.Cascade - ★★★★action 数据库检索 耗时4083

 

无PRIMARY第二次

SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div' AND CD_VAL LIKE '%0000000000' ORDER BY CD_VAL;

09:05:37.980 [http-nio-8080-exec-2] INFO  o.teapot.servlet.controller.Cascade - ★★★★action 数据库检索 耗时1848

 

有PRIMARY

SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div' AND CD_VAL LIKE '%0000000000' ORDER BY CD_VAL;

10:13:58.131 [http-nio-8080-exec-10] INFO  o.teapot.servlet.controller.Cascade - ★★★★action 数据库检索 耗时12645

 

有PRIMARY

SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div' AND ( CD_VAL LIKE '0%' OR  CD_VAL LIKE '1%' OR  CD_VAL LIKE '2%' OR  CD_VAL LIKE '3%' OR  CD_VAL LIKE '4%' OR  CD_VAL LIKE '5%' OR  CD_VAL LIKE '6%' OR  CD_VAL LIKE '7%' OR  CD_VAL LIKE '8%' OR  CD_VAL LIKE '9%' )AND CD_VAL LIKE '%0000000000' ORDER BY CD_VAL;

10:17:37.137 [http-nio-8080-exec-4] INFO  o.teapot.servlet.controller.Cascade - ★★★★action 数据库检索 耗时9472

 

SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div'  AND CD_VAL IN ( '110000000000', '120000000000', '130000000000', '140000000000', '150000000000', '210000000000', '220000000000', '230000000000', '310000000000', '320000000000', '330000000000', '340000000000', '350000000000', '360000000000', '370000000000', '410000000000', '420000000000', '430000000000', '440000000000', '450000000000', '460000000000', '500000000000', '510000000000', '520000000000', '530000000000', '540000000000', '610000000000', '620000000000', '630000000000', '640000000000', '650000000000' , '710000000000', '810000000000', '820000000000' ) ORDER BY CD_VAL;

17:40:42.474 [http-nio-8080-exec-2] INFO  o.teapot.servlet.controller.Cascade - ★★★★action 数据库检索 耗时1428

 

SELECT CD_VAL, CD_NM FROM tbl_cd WHERE CD_TYPE = 'adm_div'  AND CD_VAL IN ( '110000000000', '120000000000', '130000000000', '140000000000', '150000000000', '210000000000', '220000000000', '230000000000', '310000000000', '320000000000', '330000000000', '340000000000', '350000000000', '360000000000', '370000000000', '410000000000', '420000000000', '430000000000', '440000000000', '450000000000', '460000000000', '500000000000', '510000000000', '520000000000', '530000000000', '540000000000', '610000000000', '620000000000', '630000000000', '640000000000', '650000000000' , '710000000000', '810000000000', '820000000000' ) ORDER BY CD_VAL;

17:41:13.834 [http-nio-8080-exec-8] INFO  o.teapot.servlet.controller.Cascade - ★★★★action 数据库检索 耗时26

还可以凑合,就这样吧。

© 著作权归作者所有

共有 人打赏支持
放个屁
粉丝 123
博文 177
码字总数 285078
作品 0
日本
程序员
交换机的互连技术

单独一台交换机的端口数量是有限的,不足以满足网络终端设备接入网络的需求。为此我们需要使用多台交换机来提供终端接入功能,并将多台交换机互连,形成一个局域网。 交换机的互连主要有级联...

xmgdc
2017/06/29
0
0
通过递归算法完成树的级联勾选的一般思路

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中,发现当tree上加上checkbox后,初始化该树时会特别慢。现场树上的节...

李晓晖
2016/09/14
0
0
hibernate级联(cascade和inverse)

级联(Cascade),两个以上的设备通过某种方式连接起来,能起到扩容的效果就是级联。Hibernate级联(Cascade)是用来说明数据库中连个表之间的相互关系(一对一,一对多,多对多)中,当对主对象...

长平狐
2012/09/03
267
0
H​i​b​e​r​n​a​t​e进级​篇 - ​C​a​s​c​a​d​e​T​y​p​e​属​性

定义两个实体对象: Order 实体 @Entity@Table(name="orders")public class Order { //1-m,多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键记录private...

YOTOO
2014/05/13
0
0
jQuery Easyui datagrid对可编辑列的级联操作 ..

jQuery Easyui datagrid对可编辑列的级联操作 .. 编辑行的级联操作,关键点是要获取到到当前编辑行需要级联的列的Editor对象。 获取级联列Editor对象的步骤: 获取当前编辑行(基本上就是grid当...

夏悸
2012/11/07
0
0
JPA级联保存时能否配置调用级联对象的指定save()方法

刚接触JPA,JPA的级联操作极大的方便了开发。 但是,对JPA的级联配置有疑问。 如果我自定义了级联对象的save()方法,或者delete()方法。如何通过配置使之替代JPA默认级联时调用的保存或者删除...

蛮大人
2011/11/26
767
0
用javascript和Ajax分别写省市级联

首先用javascript来写省市级联: 1 使用数组优化省市级联-根据索引 <head> <title></title> <script type="text/javascript"> function selectCitys(){var cityArray = new Array();cityArra......

水月清风
2012/03/08
0
0
话说ORM框架中的级联更新问题

一些复杂的ORM框架,例如 Hibernate、iBatis 都是支持级联查询的。 但是在应用中,还经常需要一些级联的更新操作,例如级联的删除和数据更新。这个好像目前在程序上并没有一些简单漂亮的解决...

红薯
2009/04/23
1K
9
JPA一对一级联保存的疑问

个人在学习JPA映射时碰上一个问题: 一对一级联保存时,我看到网上给出的例子,有的需要显式 保存 被维护端 实例 ,有的 却不需要。 前者 如这个链接http://itjszz.com/read.php?tid-608.ht...

蛮大人
2011/11/21
4.5K
4
Hibernate关键字inverse和cascade

维护关联关系中,是否设置inverse属性: 1. 保存数据 有影响。 如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不...

爪哇程序猿
2015/10/22
30
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

rabbitmq学习记录(六)交换机Exchange-direct

实现功能:一条消息发送给多个消费者 交换机模式:direct 相比于之前的fanout模式,可以进一步的筛选获取消息的消费者。 fanout模式下,只要消费者监听的队列,已经与接收生产者消息的交换机...

人觉非常君
14分钟前
0
0
Java 之 枚举

Java 中声明的枚举类,均是 java.lang.Enum 类的子类,Enun 类中的常用方法有: name() 返回枚举对象名称 ordinal() 返回枚举对象下标 valueOf(Class enumType, String name) 转换枚举对象 ...

绝世武神
23分钟前
0
0
使用爬虫实现代理IP池之放弃篇

啥叫代理IP以及代理IP池 概念上的东西网上搜索一下就好了,这里简单科普一下(大部分会读这篇文章的人,基本是不需要我来科普的),白话说就是能联网并提供代理访问互联网的服务器,它提供的...

一别丶经年
39分钟前
0
0
sqoop导入数据到Base并同步hive与impala

使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 Sqool和Hive、HBase简介 Sqoop Hive HBase 测试Sqoop 使用Sqoop从MySQL导入数据到Hive 使用复杂SQL 调整Hive数据类型 不断更新 ...

hblt-j
今天
0
0
Dart 服务端开发 文件上传

clent端使用angular组件 upload_component.html form id="myForm" method="POST" enctype="multipart/form-data"> <input type="file" name="fileData"> <!-- file field --></form>......

scooplol
今天
0
0
apache和tomcat同时开启,乱码问题

tomcat和apache同时开启,会走apache的转发,执行的是AJP/1.3协议。所以在tomcat的配置文件server中, <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForU......

Kefy
今天
0
0
使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录 和ssh常用命令

ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized_keys的权利 第一步...

xtof
今天
0
0
orcale 查询表结构

SELECT t.table_name, t.colUMN_NAME, t.DATA_TYPE || '(' || t.DATA_LENGTH || ')', t1.COMMENTS FROM User_Tab_Cols t, User_Col_Comments t1WHERE t.table_name......

wertwang
今天
0
0
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大

华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps、超级...

华为终端开放实验室
今天
0
0
多 SSH Key 实现同一台服务器部署多 Git 仓库

本文以以下需求为背景,介绍详细的做法: 需在同一台服务器同时部署两个不同的 Github 仓库(对 Bitbucket 等 git 服务同样适用) root 用户可在远程登录 SSH 后附上预期的 SSH Key 进行 gi...

yeahlife
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部