使用Datastax Cassandra驱动程序时重用PreparedStatement?

Tin*_*Sky 14 java cassandra datastax-java-driver

我目前正在使用Cassandra 2的Datastax Cassandra驱动程序来执行cql3.这工作正常.我开始使用PreparedStatement's:

Session session = sessionProvider.getSession();
try {
    PreparedStatement ps = session.prepare(cql);
    ResultSet rs = session.execute(ps.bind(objects));
    if (irsr != null) {
       irsr.read(rs);
    }
}
Run Code Online (Sandbox Code Playgroud)

有时我会在日志中收到驱动程序的警告:

Re-preparing already prepared query . 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.
Run Code Online (Sandbox Code Playgroud)

这个警告是有道理的,但我不确定我应该如何重用PreparedStatement

我应该只是PreparedStatement在构造函数/ init方法中创建我的所有内容而不是简单地使用它们吗?

但是当多个线程同时使用相同的线程PreparedStatement时(特别是调用PreparedStatement.bind()绑定对象),这是否顺利

Dan*_* S. 20

您可以只初始化PreparedStatement并在应用程序运行时对其进行缓存.只要Cassandra集群启动,它就可以使用.

使用来自多个线程的语句很好(只要你不通过setXXX()方法修改它).当你调用bind()时,下面的代码只读取PreparedStatement,然后创建一个BoundStatement()的新实例,然后调用者线程可以自由变异.

这是源代码,如果你很好奇(搜索bind()).


ftr*_*llo 8

我们在使用Spring的web应用程序中使用cassandra.在我们的例子中,当封装针对cf(我们的存储库)的操作的bean被实例化时,我们创建PreparedStatements.

这里有一段我​​们正在使用的代码:

@Repository
public class StatsRepositoryImpl implements StatsRepository {

@SuppressWarnings("unused")
    @PostConstruct
    private void initStatements(){
        if (cassandraSession == null){
            LOG.error("Cassandra 2.0 not available");
        } else {
            GETSTATS_BY_PROJECT = cassandraSession.prepare(SELECTSTATS+" WHERE projectid = ?");
        }

    }       

@Override
    public Stats findByProject(Project project) {
        Stats stats = null;

        BoundStatement boundStatement = new BoundStatement(GETSTATS_BY_PROJECT);

        ResultSet rs = cassandraSession.execute(boundStatement.bind(project.getId()));
        for (Row row : rs){
            stats = mapRowToStats(row);
        }

        return stats;
    } 
Run Code Online (Sandbox Code Playgroud)

通过这种方式,每次执行方法findByProject时都会重用预准备语句.