java多线程问题以及spring jpa事物问题以及httpost传输问题总结

1、多线程事物控制问题:在新线程中执行dao中的方法的时候出现错误如下

java.lang.reflect.InvocationTargetException
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

原因是因为我的事物是控制在service层的,在service中调用dao方法没有问题,但是如果在service中开启新的线程来调用dao中的方法就会出现上面的问题。解决方法:在dao中添加事物控制@Transactional(rollbackFor = {Exception.class})即可。事物可以传递,这样也不会影响在service中的事物控制。
2、多线程事物提交问题
主线程中程序执行中开启了新线程,这时候主线程程序执行完成之后事物并不一定提交完成了,所以如果在新线程中有查询方法的时候可能就会查不到上面主线程中存的数据。所以在开启新线程的时候尽量不要在里面查询上面主线程涉及的数据,以免查询不到。
3、spring jpa在操作和表映射的实体类的时候注意
在使用和数据库表做过映射的实体类的时候,不要轻易修改或者添加该实体的属性,如果修改在逻辑执行完之后事物提交的时候,spring jpa监测到里面有内容发生改变,会自动调用.save()方法,导致数据库中的数据被刷新;所以尽量不要用这样的实体类来作为方法返回和中间操作的对象,尽量新建立一个新的实体类来操作。
4、采用http方式传输的时候内容中包含url地址,导致对方接收到的地址中把&字符转成&字符。导致url不能访问。
解决方法:需要更改http传输方式,用multipart/form-data解决传输地址不正确问题 。下面是普通的post方式和multipart的post方式java代码对比。
普通

public static String doPost(String url,Map<String,Object> params)  throws Exception{
		List<NameValuePair> pairList = new ArrayList<NameValuePair>(params.size());
		for (Entry<String,Object> entry : params.entrySet()) {
			NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue() == null ? null : entry.getValue().toString());
			pairList.add(pair);
		}
		HttpEntity reqentity = new UrlEncodedFormEntity(pairList,Charset.forName(ENCODE));
		String result = post(url,findHttpClient(),reqentity);
		return result;
	}

myltipart方式post:

public static String doPostMulti(String url,Map<String,Object> params)  throws Exception{
		MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
		for (Entry<String,Object> entry : params.entrySet()) {
			multipartEntity.addPart(entry.getKey(), new StringBody(entry.getValue().toString(), ContentType.create("text/plain", Consts.UTF_8)));
		}
		
		String result = post(url,findHttpClient(),multipartEntity.build());
		return result;
	}

附上完整个HttpClientUtil类代码:
HttpClientUtil类代码查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值