zoukankan      html  css  js  c++  java
  • 2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了

    41.获得JSON中的变量。
    //显示json串中的某个变量,name是变量名
    function json(json,name){
    var jsonObj = eval(json);
    return jsonObj[name];
    }
    不能直接使用jsonObj.name,用jsonObj[name]。


    42.Spring定时任务,加简单锁,需要“2台机器时间完全一致”。
    方案1:从“时间一致”角度
    网上有个答案:局域网内有3台服务器,由于是分布式部署,要求彼此时间误差在30s内,但是服务器不可以连互联网。
    使用时间同步服务器,NTP同步。


    还有个疑问:同步的过程中,“时间还在流逝”,怎么保证2台机器时间是一致的?
    除非网络特别好,时间误差可以忽略。


    方案2:只执行一次的角度。
    机器启动的时候,去Zookeeper注册,选举机制,只会有1个“主机”,主机执行定时任务。
    如果任务失败了,怎么重复执行?这是另外一个问题!!!




    43.基于Zookeeper实现的简单不等待锁。

      1个业务的2个线程,都去拿锁,如果拿不到,就直接返回。
     
      是否存在,可以等待一会的情况。
      场景1:如果拿不到,直接返回。
      场景2:一致等待,知道拿到锁。
      场景3:设置超时,超过预定时间,自动返回。
      
      归根结底,可以合并为“一种场景”。
      Lock getLock(String lockName,Integer timeout);


    44.引入JS,路径的问题
    staticDomain=http://dev.com:8080/static


    前端引入js ${staticDomain}/js/my.js


    如果staticDomain带了后缀“staticDomain=http://dev.com:8080/static/”,
    则js路径为http://dev.com:8080/static//js/my.js,从而导致js找不到。


    解决办法:Java后端代码,自动去掉结尾的“/”


    public static String delLastSeparator(String path) {
    if (path.endsWith("/") || path.endsWith("\")) {
    path = path.substring(0, path.length() - 1);
    }
    return path;
    }

    45.windows下mysql的root密码丢失怎么办?5步解决这个问题!


    如果忘记了 MySQL 的 root 密码,windows操作系统下可以用以下方法重新设置:


    1. KILL掉系统里的MySQL进程;


    2. 在命令提示符下(CMD),进入到MYSQL的BIN目录,用以下命令启动MySQL,以不检查权限的方式启动;
    mysqld -nt --skip-grant-tables


    3. 然后重新开打一个命令提示符的窗口(CMD)用空密码方式使用root用户登录MySQL;


    mysql -u root


    4. 修改root用户的密码;
    mysql> update mysql.user set password=PASSWORD('123456') where User='root';
    mysql> flush privileges;
    mysql> quit




    参考资料:http://www.cnblogs.com/zox2011/archive/2013/01/20/2868966.html


    5. 重新启动MySQL服务,就可以使用新密码登录了。


    46.当当分库分表框架中的2个小问题。
    https://github.com/dangdangdotcom/sharding-jdbc


    源文件是这样创建“数据库”的,在mysql-front执行,只提示“一行记录受到影响”,但是数据库并没有成功创建。
    CREATE SCHEMA IF NOT EXISTS `dbtbl_0`;
    CREATE SCHEMA IF NOT EXISTS `dbtbl_1`;
    CREATE SCHEMA IF NOT EXISTS `dbtbl_config`;


    把schema改为database就可以了
    CREATE database IF NOT EXISTS `dbtbl_0`;
    CREATE database IF NOT EXISTS `dbtbl_1`;
    CREATE database IF NOT EXISTS `dbtbl_config`;


    创建订单数据的sql语句,演示“分库分表”插入数据。
    但是存在一个“小问题”,2个不同的用户,有相同ID的1个订单。实际情况中,这样是不合理的。
     public void insert() {
        //同一个订单,有不同的用户,这个例子不够恰当
            String orderSql = "INSERT INTO `t_order` (`order_id`, `user_id`, `status`) VALUES (?, ?, ?)";
            String orderItemSql = "INSERT INTO `t_order_item` (`order_item_id`, `order_id`, `user_id`, `status`) VALUES (?, ?, ?, ?)";
            for (int orderId = 1; orderId <= 4; orderId++) {
                for (int userId = 1; userId <= 2; userId++) {
    }
    }

    47.最近在学习sharding-jdbc,去官方交流群学习了下。
    读写分离是为了缓解数据库的读压力,分库分表主要是为了缓解数据库的写压力。


    48.关于freemarker里面的hashmap使用问题。
        Map testMap = new HashMap();
            testMap.put("sh", "shanghai ");
            testMap.put("bt", "北京 ");


    <#list testMap?keys as testKey> 
           < option value="${testKey}" >
                  ${testMap[testKey]}
         </option> 
    </#list>


    <#list testMap?keys as testKey> 
           < option value="${testKey}" >
                  ${testMap.get(testKey)}
         </option> 
    </#list>

    但是,如果map的key是long,就出问题了。

    网上参考了另一篇文章“Freemaker如何遍历key为non-string类型的map?”http://www.cnblogs.com/beiyeren/p/3873494.html
    <bean id="freemarkerConfig"
              class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="templateLoaderPath" value="/WEB-INF/view/"/>
            <property name="freemarkerSettings">
                <props>
                    <prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop>
                </props>
            </property>
        </bean>
    这样就可以正常获得值了。


    但是!!!
    我发现了,另外一个问题。
    <#assign supportMap = customCombo.itemSupportMap>
    <#list supportMap?keys as key>
    ${key}
    </#list> 
    在打印map的key的时候,把方法名也打印出来了。

    getClass clone put remove get equals entrySet class hashCode keySet 226 225 size clear isEmpty containsKey values empty containsValue toString putAll 

    因此,freemarker.ext.beans.BeansWrapper也不是完全正确的。解决了1个问题的同时,又带来了另外一个问题!!!


    Freemarker的Map只支持String类型的key,只能这样了。


    参考资料:http://www.fengfly.com/plus/view-170673-1.html
    http://www.cnblogs.com/beiyeren/p/3873494.html


    49.javascript精度问题,导致后端传过来long类型的值显示不正确,有何好的解决办法?

    后端long型的订单号,"orderId":1606291143573740096


    转换成js的值,就变成了1606291143573740000。


    百度一下,网上很多人都遇到了这个问题。
    方法1:最笨的办法是,后端就用String类型。


    参考资料:https://www.zhihu.com/question/34564427?sort=created


    方法2:或者,mysql的bigint只用16位,不用太长。


    后端订单号,主键,用String类型,确实可以解决这个问题。
    但是,其它业务就想用bigint作为主键,怎么办呢?


    方法3:后端用long,异步给前端时,用string。(后端手动转换)


    50.Dubbo注册中心奇葩问题,wifi热点坑了,200分钟的经验教训。
    #dubbo.registry.address=multicast://224.5.6.10:1234
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    #dubbo.registry.address=redis://127.0.0.1:6379
    #dubbo.registry.address=dubbo://127.0.0.1:9090
    至少有4种配置,用广播multicast的方式,可以少安装启动一个软件,但是广播这种方式经常遇到问题。
    今天又遇到了,平时正常启动的,结果今天一直提示依赖的服务找不到,改成Zookeeper就可以了。


    已经是第2次遇到这种情况了,之前是修改了dubbo的端口号搞定的。


    2016年7月12日


    今天早上,dubbo服务又出现了问题。
    A服务启动正常,B服务死活连不上A。
    无论是广播,还是Zookeeper。


    调试了100分钟,最终还是逐步分析出了问题。


    第1种可能:A服务和B服务,在端口号,注册中心配置方面,出现了不一致(平时一直正常,出现问题的可能性很小。)
    第2种可能:本地DNS出现问题。(排除,本地防火墙一直是关闭的。)
    第3种可能:防火墙导致。(打算重启WindowsDNS服务的时候,看了下本地IP。)


    Eclipse控制台,一直提示连不上某个IP,192.168.1.23。
    之前的IP还是192.168.1.197,按说IP不太可能发生变化的。


    ipconfig发现有2个 IP-V4的地址。
    ping 192.168.1.23,确实ping不通。
    按道理讲,ping本地ip却不通,是不可能的。


    突然想起来,右下角的QQ电脑管家的wifi热点,还是开着的,但是连不上网。


    最终确认,就是这个因素导致的。


    wifi热点启动了,但是没有正常连网,却占了1个ipv4的地址。
    dubbo恰好又优先使用了这个ip地址,最终坑了!
    2016年7月13日
  • 相关阅读:
    Oracle序列使用:建立、删除
    struts1.x入门
    SQL的四种连接-左外连接、右外连接、内连接、全连接
    eclipse更改文件编码方式
    使用links方式安装Eclipse插件
    JAVA:Eclipse代码自动提示
    MyEclipse注释配置
    全面理解SQL
    一秒去除Win7快捷方式箭头
    Eclipse快捷键大全(转载)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462354.html
Copyright © 2011-2022 走看看