写了一个简单的点评网站抓取的程序
今天后台碰到了:
ERROR org.grails.web.errors.GrailsExceptionResolver - HibernateException occurred when processing request: [POST] /cities/yelp/94349
llegal attempt to associate a collection with two open sessions. Collection : [com.ttt.website.backend.domains.BeautySpots.beautySpotsImages#dianping-48232229]. Sta
ktrace follows:
rg.springframework.orm.hibernate4.HibernateSystemException: Illegal attempt to associate a collection with two open sessions. Collection : [com.ttt.website.backend.
omains.BeautySpots.beautySpotsImages#dianping-48232229]; nested exception is org.hibernate.HibernateException: Illegal attempt to associate a collection with two open se
ts.beautySpotsImages#dianping-48232229]
... 8 common frames omitted
有一个类:BeautySpots,它是表示每一个餐馆,在这个类里面,引用了另外一个表:
beautySpotsImages
这个是保存的餐馆的图片
异常就是说有两个 session 在同时访问这个 Collection
这个程序是单线程跑的
我贴一下代码(Groovy的代码)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
restaurant.description = description.toString()
BeautySpots.withTransaction([propagationBehavior: TransactionDefinition.PROPAGATION_REQUIRES_NEW,
isolationLevel: TransactionDefinition.ISOLATION_READ_COMMITTED]) {
restaurant.save(failOnError: true, flush: true) //这里出的问题
}
savedRestaurantsAmount++
if (isNewRestaurant) {
imageUrls = getImageUrls(restaurant.referTo, shopId)
// 下载图片在下面的方法: ScraperUtil.saveRestaurantImages
if (!ScraperUtil.saveRestaurantImages(restaurant, creator, restaurant.referTo, imageUrls, 0, 70)) {
restaurant.delete()
return
}
}
restaurant.completionProgress = POIUtil.getCompletionProgress(restaurant)
BeautySpots.withTransaction([propagationBehavior: TransactionDefinition.PROPAGATION_REQUIRES_NEW,
isolationLevel: TransactionDefinition.ISOLATION_READ_COMMITTED]) {
restaurant.save(failOnError: true)
}
需要通过同步解决,单机就采用synchronized关键字解决;多机就是分配式数据同步了,可以采用redis同步或者zookeeper
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。