- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定在整个 Grails/Hibernate/Tomcat/Database 栈中哪里是万恶之源。我的问题是:我有一项服务(当然是事务性的)用于搜索所谓的(医疗)案例。每个案例都与一名患者相关。
这是简化的关系(我省略了所有相关的元数据)。
class Case {
static belongsTo = [casePatient: CasePatient]
}
class CasePatient {
static hasMany = [cases: Case]
}
现在,当保存一个新案例时,该服务首先检查一个案例是否已经存在,如果存在,则直接返回。要保存案例,您显然需要提供一些案例相关数据和一些患者相关数据。如果案例不存在,则服务会尝试查找患者以防止重复。从标题你现在大概能猜到我的问题了。
无论出于何种恶魔般的原因,我碰巧遇到同一个病人 99 次(作为一个极端的例子)。用于标识记录的所有字段都 100% 匹配。由于搜索而应该不可能的事情。它不会一直发生,很少见,但它确实发生了,而且很糟糕。一旦有不止一名患者从搜索中返回,该服务就会像 child 一样大声喊叫,并抛出异常。毕竟只能上了。
奇怪的是:数据库上的时间戳表明记录的创建时间正好相隔 30 秒,这导致发生此困惑的总时间跨度为 50 分钟。交易似乎有 50 分钟没有保存到数据库中,否则我无法解释为什么搜索找不到任何东西。
网络服务被我们自己的尝试上传数据的软件使用。它会自行执行搜索,只有在未找到任何内容时,才会创建新案例请求。
不幸的是,我没有调试日志,所以我看不到服务器上发生了什么。我已经设置了一个测试安装来获得一些,但由于我真的不知道如何激发它...我所能做的就是等待并希望它会在某个时候发生。
总之,我很茫然。我不知道从哪里开始寻找。从服务代码来看,我(和同事)似乎不可能发生这种情况。你们对如何解决这个问题有什么建议吗?
使用的软件:
最佳答案
这是数据库。由于某些未知原因,数据库中某处存在争用,导致我的病例和患者的 INSERT 语句无法及时通过。 Grails 服务等待语句完成,但创建案例的客户端在 30 秒后超时,您有三个猜测,前两个不算数。之后,它只是继续处理下一个文件(操作是在文件基础上触发的),再次做同样的事情,而且很可能是针对同一个病人。
当第一个 INSERT 事务仍在等待处理时,第二个请求将找不到该数据并决定自己创建一个新案例和一个新患者,最终将另一个 INSERT 添加到队列中。在这种极端情况下,这种情况发生在 50 秒的时间跨度内,一旦数据库上的结破裂,就会导致 99 个保存案例请求全部被刷新。
我通过在patient表上人为地创建了一个只读不写的共享锁来验证这个论点。这意味着所有的 SELECT 都工作正常并且没有找到任何东西。只有当涉及到 INSERT 数据时,锁才会阻止执行。我等了几分钟才释放锁,然后我发现自己在不应该有的地方出现了重复的条目。
虽然我仍然需要弄清楚这个锁是从哪里来的,但我通过在服务方法开始时为该保存 session 设置一个语句超时来解决这个问题。我有一个实用方法。
static void setStatementTimeout(def session, int milliseconds) {
log.trace "->setStatementTimeout: <milliseconds: $milliseconds>"
def query = session.createSQLQuery("set statement_timeout to $milliseconds")
query.executeUpdate()
}
session
是从sessionFactory.currentSession
中获取的。
现在数据库在 15 秒后取消请求,整个保存请求被中止。
关于hibernate - Grails 事务 : duplicate data where there shouldn't be any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31672604/
什么是 hibernate 和n- hibernate ?我可以在 Visual Studio 2008 中使用它进行 C# Web 应用程序开发吗?请给我建议...我是 asp.net Web 应用
我有一个不系统地发生的异常(exception)。 我试图通过在每次迭代中刷新和清理 session 来解决此问题,但没有成功。 [quartzScheduler_Worker-7] ERROR jd
使用 Hibernate 在数据库中存储 IP 地址的最佳类型是什么? 我虽然是 Byte[] 或 String,但有没有更好的方法,或者你用什么? @Column(name = "range_fr
我正在尝试制定一个公式来选择用户个人资料的用户友好名称。它选择名字 + ' ' + 姓氏 如果其中至少有一个不为空且不为空(包含非空白字符),否则选择 短名称 (条件相同),最后,如果 短名称 为空或
在hibernate中,是否可以将鉴别器作为一个实体?例如,如果我将 Department 作为基类,将 AdminDepartment 和 ProcessingDepartment 作为子类。 De
我只想从表中获取一些列值。因此,我已经使用投影来实现这一目标。该代码有效,但我认为它无效。 我的问题是当我使用ProjectionsList并将标准条件列表设置为ArrayList时-Bulletin
你好: 我对 hibernate 缓存缓存的内容感到困惑。 从文档中,我知道 hibernate 中有缓存类型。 一级 :交易级别。 似乎要被 session 持久化的实体被缓存在这里。 二级缓存 :
我遇到了一个情况: save或update hibernate 的目标表中的某些数据 在目标表上有一个触发器,该触发器将在目标表的insert或update操作之前执行 由 hibernate 将此记
我有一个名为 Master_Info_tbl 的表。它是一个查询表: 这是该表的代码: @Entity @Table(name="MASTER_INFO_T") public class Code
我想知道如何在 Hibernate 查询语言中使用日期文字。我在我的 JPA 项目中做了如下操作(作为 Eclipselink 提供者)并且它工作正常。 SELECT m FROM Me m WHER
@Entity public class Troop { @OneToMany(mappedBy="troop") public Set getSoldiers() { ...
我正在尝试使用 hibernate 查询删除表 'user_role' 中的所有行。但每次我都会出错。有人可以帮我吗。 DaoImpl @Override public void deleteAll(
不是将数据库操作分散在四个 (osgi) 包中,而是在那里做略有不同的事情。我想创建一个负责所有持久性问题的(简单的)OSGi 包。我觉得这并不像听起来那么简单,因为“每个包都有独特的类加载器”。 因
这就是我使用生成器的方式: private Integer id; 我看到的行为是: 创建第一个对象 hibernate 分配 id = 1 删除该对象 关闭服务
对象级别的实体和值类型有什么区别。我知道实体将有一个 id 但值不会,但为什么我们需要不同的方法来映射实体与值类型? 这样做是为了让hibernate可以对值类型应用任何优化吗? 最佳答案 一个实体已
我正在使用 HibernateTemplate.findByCriteria 方法进行一些查询。现在我想在标准上创建一些 SQL 限制,比如 criteria.add(Restrictions.sql
所以我有以下代码: Query query = session.createQuery("from Weather"); List list = query.list();
如何使用Hibernate映射具有多个实体的 View ? 问候, 混沌 最佳答案 请参见Hibernate文档中第5.1.3节“类”,紧接在“Id”节之前: There is no differen
据我所知,Hibernate 有两种类型的实现 JPA的实现(2)(@Entity,@Table注解) 扩展到旧的(传统的) hibernate (没有 JPA),使用 HSQL 查询,没有注释 如果
我需要一个将条目存储为键值对的集合(因此我可以通过键查找值),但我需要一个允许多个值使用 hibernate 共享同一个键的集合 最佳答案 一个键具有多个值的映射称为多映射 - 在 Apache 公共
我是一名优秀的程序员,十分优秀!