- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 hibernate3 和 spring。
Java代码:
类 CommunicationServiceImpl,方法 sendAllMessages:
Collection<MessageToSend> messagesToSend = this.repositoriesLocator.getMessageToSendRepository().getMessagesToSend();
Iterator<MessageToSend> iteratorMesToSe = messagesToSend.iterator();
while (iteratorMesToSe.hasNext()) {
MessageToSend mts = iteratorMesToSe.next();
MessageSender sender = new SmsSender(mts, this.repositoriesLocator);
sender.start(); //run thread
}
短信发送者:
public class SmsSender extends MessageSender {
public SmsSender(MessageToSend messageToSend, RepositoriesLocator repositoriesLocator) {
super(messageToSend, repositoriesLocator);
}
public void sendMessages() {
try {
MessageToSendSms messageToSendSms = (MessageToSendSms) this.messageToSend;
Iterator<CustomerByMessage> itCbmsgs = messageToSendSms.getCustomerByMessage().iterator();
while (itCbmsgs.hasNext()) {
CustomerByMessage cbm = (CustomerByMessage) itCbmsgs.next();
//sms sending
String sResult = this.sendSMS(cb.getBody(), cbm.getCellPhone());
cbm.setStatus(CustomerByMessageStatus.SENT_OK);
cbm.setSendingDate(Calendar.getInstance().getTime());
}
messageToSendSms.setStatus(messageToSendStats.PROCESSED)
this.log.info("saving messageToSend...");
//this line dont work!
this.repositoriesLocator.getMessageToSendRepository().update(messageToSendSms);
this.log.info("messageToSend saved!");
} catch (Exception e) {
this.log.error("Error sms sender " + e.getMessage());
}
}
这是我的 appContext.xml 的一部分:
<bean id="serviceCommunication"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="target">
<ref local="communicationServiceImpl" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="communicationServiceImpl"
class="com.ninatec.fnet3.services.communication.impl.CommunicationServiceImpl"
parent="serviceParent">
</bean>
hibernate 库
repositoriesLocator.getMessageToSendRepository().更新代码:
public void update(MessageToSend messageToSend) {
try {
this.getSession().update(messageToSend);
} catch (HibernateException e) {
this.log.error(e.getMessage(), e);
throw e;
}
}
实体 MessageToSend,从未更新过。
当我调用 CommunicationServiceImpl.sendAllMessages() 时,我在一个集合中拥有所有 messagesToSend。对于每个 MessageToSend,我创建一个 Thread 来发送消息。Thread smsSender 工作正常,但不是数据库中的持久性。我的数据库中尚未更新对象 MessageToSend 中的更改。
随机错误是:
session 结束,
无法初始化代理 - 没有 session ,
无法初始化代理 - 拥有 session 已关闭,
非法尝试将一个集合与 hibernate 和两个打开的 session 相关联
未能延迟初始化角色集合:没有 session 或 session 已关闭
我不明白如何在我的架构中明确地将对象与 session 分离。
最佳答案
你正在用线程和 Hibernate session 做非常糟糕的事情。首先,CommunicationServiceImpl.sendAllMessages()
是事务性的。这意味着当您遍历 messagesToSend
集合时,MessageToSend
实体连接到 Hibernate session 。没关系。
然而,对于每个实体,您都会启动新线程* 来处理该实体。在该线程中,您对 MessageToSend
执行大量计算,包括一些子查询和更新。这是危险的竞争条件体现的地方:
如果线程启动时我们仍在主 while (iteratorMesToSe.hasNext())
循环中(我们仍在 sendAllMessages()
方法中) MessageToSend
仍然附加到在父线程中启动的原始 session 。但是,如果父线程完成了迭代(我们退出了 sendAllMessages()
)但子线程 MessageSender
仍在运行,您将遇到上述 transient 错误。 “session closed
”基本上意味着父线程在子线程完成处理之前关闭了 session 。
简单来说,你不应该让绑定(bind)到 Hibernate session 的对象从当前线程中逃逸。而是将它们显式地从 session 中分离出来(例如,通过清除 session 或进一步向上移动事务,这样当您迭代它们时,您的对象就不会附加到 session 中)并为每个处理过的行启动新事务。
* - 似乎您正在为要发送的每条短信创建一个新线程。这不是很好的可扩展性,一旦发送的消息总数达到几千条,你的系统就会崩溃。而是使用线程池 ( ExecutorService
)。
关于java - Threads 和 Hibernate session 的随机错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920349/
是否为每个 Shiny session 分配了 session ID/ session key (如果部署在 Shiny 服务器上)?如果是,我如何访问该信息?我已阅读文档here然而上网查了一下,并
我正在使用 this koajs session 模块。 我检查了源代码,但我真的无法理解。 我想知道它保存 session 数据的位置,因为我没有看到创建的文件,并且当服务器重新启动时, sessi
实现高可扩展性的一种方法是使用网络负载平衡在多个服务器之间分配处理负载。 这种方法提出的一个挑战是服务器是否具有状态意识 - 将用户状态存储在“ session ”中。 此问题的一个解决方案是“粘性
在负载平衡服务器的上下文中, session 亲和性和粘性 session 之间有什么区别? 最佳答案 我见过这些术语可以互换使用,但有不同的实现方式: 在第一个响应中发送 cookie,然后在后续响
我希望其他人向我解释哪种方法更好:使用 session 或设计无 session 。我们正在开始开发一个新的 Web 应用程序,但尚未决定要遵循什么路径。 无 session 设计在我看来更可取: 优
现在用户在他的权限中有很多角色,我将允许他点击 href 并在新窗口中扮演另一个角色。每个角色都有自己的 session 。 既然浏览器打开窗口不能用新 session 打开,我必须在服务器端想办法。
我正在尝试为express.js Node 应用程序实现 session 存储我的问题是: 如何删除具有浏览器 session 生命周期的 cookie(根据连接文档标记有 expires = fal
在开始在 golang 中使用 session 之前,我需要回答一些问题 session 示例 import "github.com/gorilla/sessions" var store = ses
我读过 Namespaced Attributes . 我尝试使用此功能: #src/Controller/CartController.php public function addProduct(
我正在努力完成以下工作: 根据用户的类型更改用户的 session cookie 到期日期。 我有一个 CakePHP Web 应用程序,其中我使用 CakePHP session 创建了我的身份验证
这是我在这里的第一个问题,我希望我做对了。 我需要处理一个 Java EE 项目,所以在开始之前,我会尝试做一些简单的事情,看看我是否能做到。 我坚持使用有状态 session Bean。 这是问题:
ColdFusion session 与 J2EE session 相比有什么优势吗? ColdFusion session documentation提到了 J2EE session 的优点,但没有
在执行任何任务之前,我需要准确地在创建 session 时创建一个 session 范围变量(因为我的所有任务都需要一个初始 session 范围变量才能运行)。因为,创建 session 时,gra
我们当前的应用使用 HTTP session ,我们希望将其替换为 JWT。 该设置仅允许每个用户进行一次 session 。这意味着: 用户在设备 1 上登录 用户已在设备 1 上登录(已创建新 s
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
假设我在两个或更多设备上打开了两个或更多用户 session (同一用户没有管理员权限)。 在当前 session 中,如果我注销,是否意味着所有其他 session 也会关闭?如果没有,有没有办法通
我正在评估在 tomcat 中使用带有 session 复制的粘性 session 的情况。根据我的初步评估,我认为如果我们启用 session 复制,那么在一个 tomcat 节点中启动的 sess
我开始使用 golang 和 Angular2 构建一个常规的网络应用程序,最重要的是我试图在 auth0.com 的帮助下保护我的登录.我从 here 下载快速入门代码并尝试运行代码,它运行了一段时
我在 Spring Controller 中有一个方法,它接受两个相同类型的参数其中一个来自 session ,另一个来自表单提交(UI)。 问题是在 Controller 方法中我的非 sessio
在我登录之前,我可以点击我的安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如您所料。 登录后,我可以继续我的业务,并访问我的安全约束内外的资源。
我是一名优秀的程序员,十分优秀!