zoukankan      html  css  js  c++  java
  • 2013年工作中遇到的20个问题:261-280

    最近遇到的20个问题,大多比较常见,很有学习价值。

    有几个是第1次遇到,大部分都解决了,挺给力的。

    个别问题,可能难以找到根本原因。

    有兴趣的,来瞧瞧吧!

    261.字符串处理最常见的bug。
     不能仅仅判断是否为null,字符串索引是否越界需要判断。
     

    private void handleStr(String ids) {
            if (ids == null) {
                return;
            }
      //可能发生字符串越界异常,java.lang.StringIndexOutOfBoundsException
       char ch = ids.charAt(0);
     



      更多情况下,使用Apache Commons Lang组件的StringUtils.isEmpty(ids)。
     
    262.应对需求变化。

     titleCell.setCellValue(tableTitle+subTitle);
     


     标题单元格的原标题是tableTitle,后来有要求增加了个子标题,我用subTitle构造的。
     现在又要求去掉子标题,我只需要把subTitle去掉就好了。
     
     分成2个变量,确实是很恰当的。
     应对需求变化也是一个好的方法。
     
     观点:程序中的概念和现实中的逻辑概念一一对应,是可行的。
     程序中的2个变量“tableTitle,subTitle”对应现实世界中的 表格标题(主标题)、子标题。
     
    263.计算函数的执行时间。
      拖拽报表有的非常慢,要7s。
      我来做优化。
     
      我首先需要知道哪些函数执行了多少时间,哪些sql花了多少时间。
      a.最笨最简单的方法是,每一个函数的调用开始和结尾都保存开始时间startTime和结束时间endTime,
      进行计算。
      b.写一个“拦截器”,拦截每一个方法的执行,计算时间。
        这个又太难了,没啥思路。
      c.想到Hibernate查询,真正执行sql语句的方法是query.list()方法。
       因此,只需要计算query.list()这个方法的执行,大概就能得出每个函数的执行时间了。
       很巧的是,我写了一个功能强大的BaseDao,大部分查询最终归结到了一个方法。
      
      

    protected List executeQueryList(String hql, Map<String, Object> params,
       Integer firstResult, Integer maxResults) {
      Query query = createQuery(hql, params);
      if (firstResult > 0) {
       query.setFirstResult(firstResult);
      }
    
      if (maxResults > 0) {
       query.setMaxResults(maxResults);
      }
      Date startTime = new Date();
      List list = query.list();
      String costTime = CostTimeUtils.getCostTime(startTime);
      println(query, costTime);
      return list;
     }
     
    


    这样,我只需要在一个地方,计算耗费的时间,就大致知道了每个方法和sql语句的实际执行时间了。
     
    264.MySQL主键的自增问题。
    机构表Organization等,主键存放的机构的ID。
    有的时候,为了保留一些范围的主键,把ID的自动增量初始值手动设置为5000等。

    265.根据优先级,调整布局,提高效率。
    数据库字段最常用的放在最前面。
    类的方法最常用的放在最上面。
    类似的还有,简历中的关键信息放在靠前的位置。

    266.一个好友同事问,很多优秀的技术人员不再写代码了?
    这多可惜啊。
    每个人的选择不同。
    不写代码,说不定薪水更多、名气更大。
    当然,不排除很多技术大牛仍然坚持写代码,收益也很好。

    267.检测数据源是否配置正确。
      Web系统后端管理界面,需要判断每个项目对应的数据库,是否配置正确。
     
     <!-- 配置多数据源映射关系 -->
     
     

    <bean id="dataSourceMap" class="java.util.HashMap">
        <constructor-arg>
          <map key-type="java.lang.String">
             <entry key="demo">
               <bean parent="abstractDataSource" >
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" />
           </bean>
             </entry>
            
              <entry key="data">
           <bean parent="abstractDataSource" >
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" />
           </bean>
             </entry>
          </map>
        </constructor-arg>
      </bean>
     
       /**
      * 判断数据库是否存在
      */
     public boolean hasDatabaseByKey(String name) {
      boolean containsKey = dataSourceMap.containsKey(name);
      if (containsKey) {
    
       try {
        Object obj = dataSourceMap.get(name);
        com.jolbox.bonecp.BoneCPDataSource dataSource = (com.jolbox.bonecp.BoneCPDataSource) obj;
    
        String password = dataSource.getPassword();
        String username = dataSource.getUsername();
        String url = dataSource.getJdbcUrl();
    
        Connection con = DriverManager.getConnection(url, username,
          password);
        if (con != null) {
         con.close();
        }
        return true;
    
       } catch (Exception e) {
        LOG.error("Database name error:" + name);
        e.printStackTrace();
       }
      }
      return false;
     }
     
    



    268.手动获取Hibernate会话Session的Connection。
          
      

    Session session = dataResourceDao.getsession();
      Connection con = session.connection();
      con.setAutoCommit(false);
    
      dataDao.add();
      con.commit();
     
    


    这个地方获取的Connection,仍然是Spring管理的数据库连接池中的。
     不需要调用con.close()方法。
     如果,关闭了,那么数据库连接池中仍然会保存着该Connection,但是却是关闭的。
     会导致,再次获取Connection的时候,提示“Connection已关闭”。

    269.表名是数据库的关键字。
      Group,Order都是MySQL的关键字。
     

     select * from Group where projectId =1 and groupType =1 and type =1
    


      会报SQL语法错误。

    270.Tomcat工作目录。
    项目重构后,改动比较大,重新部署后,报错。
    清除Tomcat的工作目录下的项目文件
     C: omcatwork
     
    271.WAL: Write-Ahead Logging 预写日志系统。
    数据库中一种高效的日志算法,对于非内存数据库而言,磁盘I/O操作是数据库效率的一大瓶颈。
    在相同的数据量下,采用WAL日志的数据库系统在事务提交时,磁盘写操作只有传统的回滚日志的一半左右,
    大大提高了数据库磁盘I/O操作的效率,从而提高了数据库的性能。

    272.请假单。
    原来请假单统一交给项目经理,项目经理亲笔签字,然后统一交给开发计划组或者人事部。
    现在,调整岗位后,产品经理直接盖章签字,自己负责交给人事部。
    盖章签字,高端大气上档次啊
    我也好想要一个!

    273.多写文档风格的JavaDoc注释。
    以前,只有对类、public方法、public字段才写JavaDoc风格的注释,后来突然发现私有字段、私有方法也很有必要JavaDoc注释。

    /**
     *作者的名字
     */
     private String authorName;
     


    这样,在使用这个变量的地方,鼠标移动到字段上方,会有提示,而/* */这种风格的注释没有提示。

    274.Hibernate的实体类实现Serializable接口。

    public class User implements Serializable;
    


    实现序列化接口是可选的。
    对于需要缓存到硬盘的实体,必须实现Serializable接口。

    hibernate有二级缓存,缓存会将对象写进硬盘,就必须序列化,以及兼容对象在网络中的传输等等。
    参考资料:http://blog.sina.com.cn/s/blog_7d0b04e70101hp7r.html

    275.HQL语句的一个弊端。
    String hql="from User where name=:name";
    当实体和字段的名字发生变化后,hql语句将会报错。
    Eclipse自带的重命名功能,不能对hql语句相关的实体和字段一起重命名。

    在项目的初期,定义合理的数据库表名、字段名、实体类名、属性名,是非常重要的。
    一定要有一个合理的可行的规范。

    276.联表查询 字段冲突。
      最近把一些表的主键,修改成了id,原来的是cid这种。
      构造hql连接表,排序的时候 order by id.
      大致的错误提示"The id is Ambiguous."
      Ambiguous adj. 含糊的,不明确的; 引起歧义的; 有两种或多种意思的; 模棱两可

    277.CSDN空间无法关注好友。
       最近几个月,有好多人关注我,从几十人增长到450左右。
       由于以前,我经常关注一些人,过去关注的+最近关注我的粉丝,已经达到了999。
       经过我邮件和博客私信,向CSDN官方反馈问题,还是没有得到解决。
      
       CSDN官方比较在意的信息:
       操作系统和浏览器
      
       我的以下尝试都是失败的:
       Windows7+QQ浏览器
       Windows7+搜狗浏览器
       Windows7+Firefox
       Ubuntu10+Firefox
       2太电脑,2种系统,3种浏览器,2种ip都不可以正常“关注”。
       而另外一个帐号,以前的小号,huoyingfans,能够正常“关注”。
      
       最后,我给CSDN官方产品客户打了电话,反馈了我遇到的特殊问题,告诉他们我的帐号和密码,
       最终,CSDN官方-研发人员调试出了问题,“已关注999”达到上限了。
      
       这个问题让人郁闷很久,就是错误提示“关注达到上限999”没能正确显示出来。
      
    278.一个没有复现的MySQL异常。

    Caused by: org.springframework.jdbc.UncategorizedSQLException: Hibernate flushing: Could not execute JDBC batch update;
    
    uncategorized SQLException for SQL
    [update Dashboard set projectid=?, groupid=?, name=?, intro=?, createUser=?, type=?,
    createUserId=?, createDate=?, widgets=?, filtersCollection=?, metricsCollection=?,
    dimensionsCollection=?, periodsCollection=?, reportIds=? where id=?];
    
    SQL state [HY000]; error code [1206]; The total number of locks exceeds the lock table size;
    nested exception is java.sql.BatchUpdateException: The total number of locks exceeds the lock table size
    
    


    这个涉及到MySQL IndoDB的一些问题。

    关键是项目中的Dashboard这个表,数据量很小哦,没有复现。

    279.启动MySQL。
    service mysqld restart
    更多启动方式,可以参考 http://blog.sina.com.cn/s/blog_4d6c45250100y890.html

    Debian 操作系统
    咱的MySQL安装在user/bin目录下
    应该用mysql_safe这个命令来启动,没有mysqld。

    可能是普通用户安装的,某些文件夹的权限比较低。
    root启动,总是报错,无法创建某个目录下的文件。

    mysql_safe 启动的时候需要指定MySQL的数据目录,咱们没有使用默认的。

    280.SSH突然连接不上远程Linux服务器了。
    其中,我们常用的2台机器都连不上了。

    错误信息:ssh_exchange_identification: Connection closed by remote host

    根据错误提示和2台机器都突然就连接不上了,我觉得不太可能是私钥出问题。

    下午,去找运维部相关同志,恰好不在。
    只能顺路请教了以下运维部以前的二把手,2012年春,实习期间的小Boss。
     ssh ip -v
     通过-v参数,打开调试模式,显示了更详细的信息。
     
    OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: Applying options for *
    debug1: Connecting to 192.168.1.111 port 22.
    debug1: Connection established.
    debug1: permanently_set_uid: 0/0
    debug1: identity file /root/.ssh/identity type -1
    debug1: identity file /root/.ssh/id_rsa type -1
    debug1: identity file /root/.ssh/id_dsa type -1
    debug1: loaded 3 keys
    ssh_exchange_identification: Connection closed by remote host

    小Boss:
    因为checking和验证都做完了,准备建立连接了,直接断了。
    显然是目标端服务器的公钥还没开始校验。

    这个需要用远程卡登上目标机器,然后查看security的日志,一看就知道了。
    从本机log没看出异常来。

    最终解决方案:错误地修改了sshd的权限。
    感言:Linux和MySQL的很多细节,都不太熟悉。需要认真看看书,补补课。

    相关阅读

    工作问题 http://blog.csdn.net/FansUnion/article/category/1334371

    原文参见http://FansUnion.cn/articles/2963

  • 相关阅读:
    Python-2d形变 动画 表格
    Python-JS (JS介绍~JS的基础数据类型)
    Python-CSS高级 题目
    Python-ccs动画及阴影
    Python-css高级
    Python3 shevel模块,更高级的json序列化数据类型模块(比pickle更高级)
    Python3 第五周大纲(模块,导入方法、import本质,导入优化,模块的分类)
    python3 5月26日 time模块常用时间转换 &datetime()模块学习 random()
    Python软件目录结构
    Python3 json &pickle 数据序列化
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463497.html
Copyright © 2011-2022 走看看