2013年工作中遇到的20个问题:261-280

来源:互联网 发布:马勒交响曲知乎 编辑:程序博客网 时间:2024/04/29 16:42

最近遇到的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:\tomcat\work
 
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

原创粉丝点击