如何只准备一次Cassandra Accessor查询

时间:2015-10-05 08:49:47

标签: java cassandra cassandra-2.0 datastax-java-driver

我正在使用Cassandra Java Driver。为了使用Object Mapper,我创建了Accessor

@Accessor
public interface MyAccessor
{
    @Query("SELECT * FROM my_table WHERE id = ? AND event_day = ? AND event_time > ? AND event_time < ?")
    Result<MyEvent> getEvents(UUID id, String eventDay, Date eventFromDate, Date eventToDate);
}

我在这样的方法中使用这个访问器:

public List<MyEvent> getEvents(UUID id, String eventDay, Date eventFromDate, Date eventToDate)
    {
        MappingManager manager = new MappingManager(_cassandraDatabaseManager.getSession());

        MyAccessor myAccessor= manager.createAccessor(MyAccessor.class);

        return myAccessor.getEvents(id, eventDay, eventFromDate, eventToDate).all();
    }

在我的应用程序中,我多次调用此方法,并在日志中收到以下警告:

Re-preparing already prepared query SELECT * FROM my_table WHERE id = ? AND event_day = ? AND event_time > ? AND event_time < ?. Please note that preparing the same query more than once is generally an anti-pattern and will likely affect performance. Consider preparing the statement only once.

使用Cassandra Accessor的最佳做法是什么?我应该只创建一次Accessor然后缓存它吗?

1 个答案:

答案 0 :(得分:3)

  

我应该只创建一次Accessor然后缓存吗?

您至少应该缓存MappingManager。它在内部缓存访问器实例,因此在同一个管理器实例上对createAccessor的连续调用将只花费您的哈希映射查找。如果要避免该查找,也可以缓存访问者实例。