这个笔记我计划作为个人笔记,记录那些工作中遇到的细节问题。
1、bug处代码
sql=sql.replace(":TABLE_NAME", tableName);
sql是个成员变量,private String sql = "select id,times from :TABLE_NAME where id between ? and ?";
查出的数据不正确!
打印sql出来发现:TABLE_NAME一直没变,或者说与tableName不一样。
查看代码发现,此类C的引用类A继承类B,而B是一个多线程类,即A是多线程,导致C.sql不安全。
2、linux中执行java脚本start.sh,报错:
Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
发现start.sh中未加上 -cp . /
导致加载不到环境变量。
3、在使用单机solr时,建索引报错:
RemoteSolrException: Expected mime type application/octet-stream but got text/html
是因为返回404,http://localhost:8888/solr/#/zbRoomNum-xiu去掉#
4、solr会对空格做处理,插入solr时,2边空格要去掉!我们逻辑是“中国好声音”,中国被替换成了" ",输入索引是“ 好声音”,返回数据会把" "去掉变成“好声音”,索引里面内容跟显示的内容不一致,导致用“好声音”,完全匹配检索不出来。
5、在solr-core-xxx.jar包中,package org.apache.solr.client.solrj.embedded; EmbeddedSolrServer类是一个内置SolrServer,区别于HttpSolrServer,
使用方法:solrHome为core的路径。
this.solrHome = solrHome;
if (solrHome != null) {
System.setProperty("solr.solr.home", solrHome);
} else {
throw new RuntimeException("请solrHome不能为空值");
}
CoreContainer container = new CoreContainer(solrHome);
EmbeddedSolrServer localServer = new EmbeddedSolrServer(container,coreName);
6、将long写成了Long,在大数据的时候,性能会有影响。应该优先使用基础数据类型,而不是装箱基本类型。
7、数组实现的栈,很可能栈中维护“非活动部分”对象引用,需要自己将对象清除,
public Object pop(){
if(size ==0){
throw new EmptyException();
}
Object result = elements[--size];
elements[size]=null;
return result;
}
8、clone深拷贝以及iterator返回值
clone的时候,为了不影响被拷贝对象的值,最好是进行深copy,这样copy出来的对象不会影响被copy对象;
iterator的返回值只能进行“读”,不要尝试改变它的值,因为iterator的内部返回值没有new新的对象封装结果,一旦改变迭代出的对象,会改变原有容器值。
9、复合优先于继承,接口优先于抽象类,代理模式延迟加载性能优化。
10、不同分支(即“不同classloader”加载的类)的类装载器具有隔离性,类实例之间不能相互访问!即它们装载同一个类会有2个不同的class实例。
11、我在JSP页面中使用了EL表达式${param.ftablename==nullexamField.ftabblename:param.ftablename},自己测试没有错误,放到同事机器上就报错(上面的错误),说我的写的不对,没见过EL表达式里使用三目运算符的,非得让我换成其他的判断形式,换就换,反正程序咋写都一样,有时间了自己查原因。
问题不好查,一样的代码只是放到不同的机器上了,后来发现我用的Tomcat5.5版本,同事的是Tomcat6.0版本,开始以为是Tomcat6.0的一个bug或是不再支持那样的写法,后来通过规范代码,在运算符与表达式之间加空格,改为<c:out value="${param.ftableid==null ? examField.ftableid : param.ftableid}"></c:out>,就不报错了,正常运行。
看来不是Tomcat6.0的bug,还是自己代码写的不规范,标准的三位运算表达式Expression1 ? Expression2 :Expression3,每个表达式和运算符之间,都有一个空格,否则Tomcat6.0是无法识别的。有点像Python的行为强制程序员写规范代码。
12、
BeanUtils.copyProperties这个东西有个隐藏点要注意,比如A类有字段id,Long类型,B类字段id,String类型,
BeanUtils.copyProperties(aa,bb);之后,bb.getId()为null,也不报错
13、