记两例程序问题排查

1、应用系统A多线程向应用系统B发送消息,B系统根据消息进行逻辑处理修改状态及生成任务处理。
A系统可能会发送重复消息到B系统,B系统必须保证没有生成多余的任务。但问题就是没有这样。

查!查!查!
最终发现对多线程同步处理的还是有问题,假设逻辑处理类P里有逻辑处理方法M,
虽然对M进行了锁处理,但是每次消息过来还是new出新的P,每个P对应自己的M,导致M的锁有名无实。
class P{
public synchronized M(){……}
}
修改:
方式一:单例模式,保证所有消息线程用同一个P。
class P{
private static P p;
private P();
public static synchronized P getDefault(){
if(p == null){
p = new P();
return p;
}
public synchronized M(){……}
}
方式二: public static synchronized M(){……} 使用静态同步方法
或者
再次总结:

对于实例同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前对象的Class对象。
对于同步方法块,锁是Synchonized括号里配置的对象。
注:关于单例模式有很多写法,这里只是参考一种。

总结:多线程问题的处理还是有很多学问,需要细心仔细分析每一步的情况问题。

2、数据库系统
由于之前的数据库服务器坏掉了,应用的数据库被迫换到另外一台机器上,切换换成后报错:

Failed to obtain/create connection. Reason : Connection could not be allocated because:
Io exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169869568)(ERR=12519)(ERROR_STACK=(ERROR=(CODE=12519)(EMFI=4))))
监听过载,应该是数据库连接数满了,分配新的连接失败。
修改数据库连接数,process和session。

总结:迁移系统注意环境问题, 数据库系统能支撑多少个应用需要了解,最大负荷搞清楚。

你可能感兴趣的:(Java)