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

  • 相关阅读:
    微信小程序 单选按钮 最佳
    微信小程序 单选按钮的实现
    微信小程序 单选框实现
    Java Code To Create Pyramid and Pattern
    Java language
    npm Err! Unexpected end of JSON input while parsing near
    Node.js Express FrameWork Tutorial
    Higher-Order Function Examples
    Create First HTTP Web Server in Node.js: Complete Tutorial
    Node.js NPM Tutorial: Create, Publish, Extend & Manage
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463497.html
Copyright © 2011-2022 走看看