【问题标题】:cassandra trigger create vs updatecassandra 触发器创建与更新
【发布时间】:2016-05-26 23:50:02
【问题描述】:

我需要在 java 中实现一个 cassandra 触发器,它将对 INSERT 和 UPDATE 操作采取不同的操作。

我已经看到如何在问题 Cassandra sample trigger to get the deleted row and column values 中识别 DELETE 操作,但我在 ColumnFamily 对象中看不到任何允许代码区分 INSERT 与 UPDATE 的方法,是否存在实现这一目标的方法?

【问题讨论】:

    标签: triggers cassandra


    【解决方案1】:

    INSERTUPDATE 在概念上没有任何区别。事实上,一个 INSERT 和一个 UPDATE 只是突变。 Cassandra 给它们起了不同的名字,以便来自关系数据库的人有熟悉的概念

    【讨论】:

    • 感谢您的回复。我知道从数据库的角度来看没有区别,但我希望有一种方法可以区分触发器,因为特定的应用程序关心是创建了新行还是更新了现有行。
    • 存储引擎有一个技巧来区分 INSERT 和 UPDATE。 INSERT 操作总是创建一个行标记。我不知道您是否可以通过 Trigger API 访问此信息
    【解决方案2】:

    正如@doanduyhai 提到的,并且根据Casssandra sources,只有INSERT 操作会更新行时间戳(LivenessInfo)。 对于其他操作,此时间戳不会更新并且等于 Long.MIN_VALUE。

    检查INSERT操作的自定义触发器

    public class CustomTrigger implements ITrigger {
        @Override
        public Collection<Mutation> augment(Partition partition) {
            checkQueryType(partition));
            return Collections.emptyList();
        }
    
        private void checkQueryType(Partition partition) { 
            UnfilteredRowIterator it = partition.unfilteredIterator();
            while (it.hasNext()) {
                Unfiltered unfiltered = it.next();
                Row row = (Row) unfiltered;
                if (isInsert(row)) {
                    // Implement insert related logic
                }
            }
        }
    
        private boolean isInsert(Row row) {
            return row.primaryKeyLivenessInfo().timestamp() != Long.MIN_VALUE;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 2012-07-31
      • 2017-03-27
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多