当Infinispan作为数据网格时,是否可以配置“唯一”约束?

时间:2013-07-30 11:53:43

标签: java infinispan

我有以下学生班。

public class Student implements Serializable {

    private int contestantId;
    private String email;
    private String password;
    private String firstName;
    private String lastName;
    private String contact;
    private String country;
    private String countryCode;
    private String school;

    ...
    A couple more properties as well as getters and setters...
    ...
}

我的业务逻辑要求电子邮件和联系号码是唯一的。对于传统的RDMS,我可以通过将列设置为UNIQUE并处理出现的任何约束异常来轻松实现此目的。

由于我们的托管环境(OpenShift不扩展数据库),我想将现有的应用程序从直接在PostgreSQL中存储数据转换为使用Infinispan的分布式数据网格。但是,我现在面临的主要问题是我无法弄清楚如何对电子邮件和联系人强制执行UNIQUE约束。

我的问题是否有解决方法,或者我必须得出结论Infinispan不适合我的特定要求?

1 个答案:

答案 0 :(得分:2)

数据网格可以提供令人印象深刻的可扩展性功能,因为每个条目都是严格独立的。因此,考虑“独特”验证甚至没有意义,但通过重新设计问题可以有选择。

  • 您可以使用缓存来存储通过电子邮件键入的学生数据,使用密钥的第二个缓存可以使用联系人编号。在创建新条目之前,您已验证它尚未存在。 (可选)您可以将两个操作包装在事务中,或使用 putIfAbsent 操作。在一个缓存中存储数据,在第二个缓存中,您可以存储副本(如果有用)或仅存储标记令牌,或者另一个缓存中的密钥可以轻松地找到来自不同属性的学生。

  • 您可以使用索引,因此您可以通过电子邮件/联系人等搜索学生。

  • 您可以使用组合。我可能会在尝试插入之前使用索引进行检查,因此我可以灵活地访问任何字段,并且不需要复制数据或制作太不寻常的映射,但是在插入时我仍然会使用带有 putIfAbsent 操作,以确保并发线程不会同时尝试创建同一个学生。