积跬步,致千里

这个笔记我计划作为个人笔记,记录那些工作中遇到的细节问题。

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、

使用 init-method来做一些初始化工作,因为该类还注入依赖了一些其他类, 而init-method的执行时间很难预测,依赖一些没有完成初始化的类和方法,有可能导致spring初始化不成功(而且很难找到问题,因为有时成功,有时失败)。换成ApplicationListener<ContextRefreshedEvent>,监听容器启动完成,然后执行初始化操作。
14、
有个域名api.xx.com一直403,在nginx服务器上,加白名单也没有用,最后发现,这个走的 CDN,需要直接绑定Ip才行
15、
nginx现在也可以做tcp负载,为什么不用呢?个人觉得有以下2点考虑
1、故障探测太慢,比如A挂了,几秒钟,而且不能重新发给健康的节点
2、负载之后,并发也好像不如dubbo
16、
select in 很慢
select count(1) from crm_visit_card_lib where source_type in (select value from sys_dict where type='sem_source_type');
crm_visit_card_lib 表很大,select value from sys_dict where type='sem_source_type'单独查很快,select count(1) from crm_visit_card_lib where source_type in (11,12,13,14,15,91,92,93,94,102,103,104);单独查询也很快。
解决:使用inner join on 改造
select count(1) from crm_visit_card_lib a inner join sys_dict b on a.source_type=b.value where b.type='sem_source_type';
17、mysql表设计之n-n,不一定需要关联表,比如规则rule,规则组rule_group,在规则中的有个value字段,type=0存规则值,如果type=1存规则组id。这种设计,去除了中间表。
18、
new ConcurrentHashMap<>(16, 0.75f, aggressiveConcurrencyLevel);
aggressiveConcurrencyLevel用户预估并发修改线程数,来初始化多少个segment。
loadFactor 负载因子,默认0.75f,map中元素大于loadFactor 就要rehash。
19、
ForkJoinPool中,在动态扩容的时候,将大小增大到2倍,把旧的数组对象copy到新数组,同时把旧的对象置空null,回收掉。
20,、
quartz 有一个任务1分钟执行一次,但是处理数据非常多,1分钟执行不完。在没有使用异步处理的情况下,并且配置了org.quartz.threadPool.threadCount = n,n>1。会同时有多个task一起执行,导致并发问题。
解决方案有
1、job run方法中使用异步,确保task一分钟在主线程上退出。
2、quartz不并发,即 当上一个task没有执行完成的时候,下一个task不执行。
可以在配置文件中加:<property name="concurrent" value="false" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值