5

我正在尝试使用 phantom scala 驱动程序连接到 cassandra 数据库(使用 scala 2.11.2)

我在他们的博客上关注了这篇文章:http: //blog.websudos.com/2014/08/a-series-on-cassandra-part-1-getting-rid-of-the-sql-mentality/

(注意github上只有2.11编译的phantom-dsl jar,不知道有没有问题?)

我只有一个对幻影的依赖

    <dependency>
        <groupId>com.websudos</groupId>
        <artifactId>phantom-dsl_2.11</artifactId>
        <version>1.2.7</version>
    </dependency>
    <dependency>
        <groupId>com.datastax.cassandra</groupId>
        <artifactId>cassandra-driver-core</artifactId>
        <version>2.0.1</version>
    </dependency>

当我编译我的项目时,我收到关于 session 的这个错误:

Main.scala:32: error: could not find implicit value for parameter session: com.datastax.driver.core.Session
[ERROR]       select.where(_.firstName eqs firstName).limit(5000).fetch()
[ERROR]                                                                ^
[ERROR] one error found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

在他们的 github 上,有一个带有 session 的示例:

  implicit val session = SomeCassandraClient.session;

但我不明白 SomeCassandraClient 在哪里?

有什么建议吗?

4

2 回答 2

2

当您定义一个幻像表时,一种非常常见的做法是为会话注入一个简单的特征。这正是我们以这种方式创建连接器的原因,因此它们可以通过 trait mixin/inheritance 自动提供会话。

import com.websudos.phantom.connectors.SimpleCassandraConnector

trait MyConnector extends SimpleCassandraConnector {
  override val keySpace = "whatever"
}

现在,当您定义 时class MyTable,您应该定义:

object MyTable extends MyTable with MyConnector {
  def getById(id: String): Future[Option[..]] {
  }
}

您还应该使用更新版本的 Phantom,分别为 1.5.0。Scala 2.11 支持在 1.2.7 中相对较新,因此可能存在一些奇怪的问题,但现在所有问题都已修复。

您也不必担心会创建多个对象。使用连接器时,底层的 Cassandra 连接实际上是全局的,所有相关的锁都已到位。您正在做的是为您的所有表格提供完全相同的会话,即使它可能看起来不是这样。

于 2015-02-27T19:22:05.353 回答
2

您可以从您的连接器(即您正在寻找的“SomeCassandraClient”)中获取会话。

您在某处定义了连接器,例如:

trait Connector extends SimpleCassandraConnector {
    val keySpace = "your_keyspace"
    // other connection params as needed
}
object Connector extends Connector

然后做一个

implicit val session = Connector.session

这样您就不必多次定义连接 IP 和密钥空间 ;-)

于 2015-02-10T18:29:46.887 回答