文档章节

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

FansUnion
 FansUnion
发布于 2015/10/22 10:30
字数 2575
阅读 2
收藏 0
点赞 0
评论 0

最近遇到的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

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 57
博文 858
码字总数 825464
作品 0
丰台
高级程序员

暂无文章

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
12分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部