我使用Spray
和Slick
成功实现了一个简单的Web服务,该服务通过Spark ML预测管道传递传入的请求。在我尝试添加数据层之前,一切正常。我选择Slick似乎很受欢迎。
但是,我无法让它正常工作。我的大部分代码都基于Hello-Slick Activator Template。我像这样使用DAO对象:
object dataDAO {
val datum = TableQuery[Datum]
def dbInit = {
val db = Database.forConfig("h2mem1")
try {
Await.result(db.run(DBIO.seq(
datum.schema.create
)), Duration.Inf)
} finally db.close
}
def insertData(data: Data) = {
val db = Database.forConfig("h2mem1")
try {
Await.result(db.run(DBIO.seq(
datum += data,
datum.result.map(println)
)), Duration.Inf)
} finally db.close
}
}
case class Data(data1: String, data2: String)
class Datum(tag: Tag) extends Table[Data](tag, "DATUM") {
def data1 = column[String]("DATA_ONE", O.PrimaryKey)
def data2 = column[String]("DATA_TWO")
def * = (data1, data2) <> (Data.tupled, Data.unapply)
}
我在Boot
对象
object Boot extends App {
implicit val system = ActorSystem("raatl-demo")
Classifier.initializeData
PredictionDAO.dbInit
// More service initialization code ...
}
我尝试在完成服务请求之前将记录添加到我的数据库
val predictionRoute = {
path("data") {
get {
parameter('q) { query =>
// do Spark stuff to get prediction
DataDAO.insertData(data)
respondWithMediaType(`application/json`) {
complete {
DataJson(data1, data2)
}
}
}
}
}
当我向我的服务发送请求时,我的应用程序崩溃
java.lang.OutOfMemoryError:PermGen space
我怀疑我是否错误地实施了Slick API。很难从文档中分辨出来,因为它将所有操作都填充到主方法中。
最后,我的conf与激活器ui相同
h2mem1 = {
url = "jdbc:h2:mem:raatl"
driver = org.h2.Driver
connectionPool = disabled
keepAliveConnection = true
}
之前有没有遇到过这个?我正在使用Slick 3.1
答案 0 :(得分:3)
java.lang.OutOfMemoryError: PermGen space
通常不会影响您的使用,这是oracle says about this。
详细信息PermGen空间表示永久代已满。永久生成是堆的区域,其中存储类和方法对象。如果应用程序加载了大量类,则可能需要使用-XX:MaxPermSize选项增加永久代的大小。
我认为这不是因为Slick API的实现不正确。这可能是因为您正在使用多个框架来加载许多类。
您的选择是:
-XX:MaxPermSize