卡桑德拉Datastax saveQuery与轻型交易
问题描述:
我试图通过BatchStatement卡桑德拉Datastax saveQuery与轻型交易
import com.datastax.driver.mapping.Mapper;
batch.add(mapper.saveQuery(itr.next()));
坚持一个目标是卡桑德拉和我想有IF NOT EXISTS条款像
INSERT INTO customer_account (customerID, customer_email)
VALUES (‘LauraS’, ‘[email protected]’)
IF NOT EXISTS;
我应该如何通过saveQuery实现IF NOT EXISTS?
答
不幸的是,映射API只支持简单的CRUD操作,所以在这种情况下轻量级事务是不可能的。您可以使用两种方法来解决此问题:
-
使用映射存取器,那么您的代码将看起来像 访问接口:
代码@Accessor public interface UserAccessor { @Query("INSERT INTO sandbox.user (user_id, name) VALUES (:userId, :name) IF NOT EXISTS") Statement insertUser(@Param("userId") UUID userId, @Param("name") String name); }
地方:
Statement statement = userAccessor.insertUser(user.getUserId(), user.getName());
然后你可以把声明放在
BatchStatement
-
使用查询生成器:
Insert insert = new QueryBuilder(cluster).insertInto("sundbox", "user") .value("user_id", user.getUserId()) .value("name", user.getName()) .ifNotExists();
Insert
是Statement
一个亚型,所以你可以把它放在BatchStatement
为好。取到的注意,我用的驱动程序2.2.0,所以我用new QueryBuilder(cluster).insertInto(...
在这种情况下,如果你使用较低版本的驱动程序,你应该使用IM“ifNotExists()”使用QueryBuilder.insertInto(...
INSERT语句我” m看到错误“com.datastax.driver.core.exceptions.UnavailableException:没有足够的副本可用于查询一致性QUORUM(2个必需但只有1个活动)”,它不会在删除''ifNotExists()'时出现。我正在使用datastax驱动程序2.1.7。 –
如果您使用轻量级事务,则需要使用准确的复制因子。如果只有一个节点,请将keyspace的'replication_factor'更改为1 –