Postgre SQL   发布时间:2022-05-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用Slick执行并发查询时,postgresql – NullPointerException异常大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用PostgreS 9.3和Slick 3.1.1进行Scala应用程序.当多个查询同时执行时,我在光滑的驱动程序上得到空指针异常.

这是我的简化代码.我正在创建多个演员,它们将从数据库中调用相同的方法进行查询.

package com.app.repo

import java.sql.timestamp

import akka.actor.{Actor,ActorSystem,Props}
import slick.driver.POSTGResDriver
import slick.driver.POSTGResDriver.API._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.FiniteDuration
import scala.util.{Failure,success}

case class SampleData(ID: Long,name: String,createDate: java.sql.timestamp)

object tables extends {
  val profile = POSTGResDriver
} with tables

Trait tables {
  val profile: POSTGResDriver

  import profile.API._

  class SampleDatatable(_tableTag: Tag) extends table[SampleData](_tableTag,Some("processing"),"SampleData") {
    def * = (ID,name,createDatE) <>(SampleData.tupled,SampleData.unapply)

    def ? = (Rep.some(ID),Rep.some(Name),Rep.some(createDatE)).shaped.<>({ r => import r._; _1.map(_ => SampleData.tupled((_1.get,_2.get,_3.get))) },(_: Any) => throw new Exception("InserTing into ? projection not supported."))

    val ID: Rep[Long] = column[Long]("SamplEID",O.autoInc,O.PrimaryKey)
    val name: Rep[String] = column[String]("name")
    val createDate: Rep[java.sql.timestamp] = column[java.sql.timestamp]("CreateDate")
  }

  lazy val sampleDatatable = new tablequery(tag => new SampleDatatable(tag))
}

class SamplequeryingActor(delay: FiniteDuration,duration: FiniteDuration) extends Actor {

  import scala.concurrent.duration._

  overrIDe def preStart() = {
    context.system.scheduler.schedule(0.second,duration,self,"tick")
  }

  overrIDe def receive: Receive = {
    case "tick" => {
      println("tick received.. ")
      //val range = 1 until 1000
      RepositoryImpl.reader.onComplete({
        case success(r)  => println(s"got sum as ${r.getorElse(0)}")
        case Failure(eX) => ex.printstacktrace()
      })

    }
  }
}

object DriverHelper {
  val user = "POSTGRes"
  val url = "jdbc:POSTGResql://192.168.1.50:5432/MyDatabase"
  val password = "password"
  val jdbcDriver = "org.POSTGResql.Driver"
  val db: POSTGResDriver.BACkend.DatabaseDef = Database.forURL(url,user = user,password = password,driver = jdbcDriver)
}

object RepositoryImpl {
  val db: POSTGResDriver.BACkend.DatabaseDef = DriverHelper.db

  val Now = new timestamp(System.currentTimeMillis())

  def reader = {
    db.run(tables.sampleDatatable.filter(_.createDate > Now).map(_.ID).sum.result)
  }

  def insertBatchRecords(List: List[SampleData]) = {
    db.run(tables.sampleDatatable ++= List)
  }

}

object PGConnectionTester extends App {

  import scala.concurrent.duration._

  val sys = ActorSystem("sys")
  sys.actorOf(Props(classOf[SamplequeryingActor],1.seconds,10.seconds))
  sys.actorOf(Props(classOf[SamplequeryingActor],10.seconds))
}

当我执行上面的代码,我得到如下错误:

java.lang.NullPointerException
    at slick.jdbc.DriverDatasource.getConnection(DriverDatasource.scala:98)
    at slick.jdbc.DatasourceJdbcdatasource.createConnection(Jdbcdatasource.scala:64)
    at slick.jdbc.JdbcBACkend$BaseSession.conn$lzycompute(JdbcBACkend.scala:415)
    at slick.jdbc.JdbcBACkend$BaseSession.conn(JdbcBACkend.scala:414)
    at slick.jdbc.JdbcBACkend$SessionDef$class.prepareStatement(JdbcBACkend.scala:297)
    at slick.jdbc.JdbcBACkend$BaseSession.prepareStatement(JdbcBACkend.scala:407)
    at slick.jdbc.StatemenTinvoker.results(StatemenTinvoker.scala:33)
    at slick.jdbc.StatemenTinvoker.iteratorTo(StatemenTinvoker.scala:22)
    at slick.jdbc.Invoker$class.first(Invoker.scala:31)
    at slick.jdbc.StatemenTinvoker.first(StatemenTinvoker.scala:16)
    at slick.driver.JdbcActionComponent$queryActionExtensionMethodsImpl$$anon$3.run(JdbcActionComponent.scala:228)
    at slick.driver.JdbcActionComponent$SimpleJdbcDriverAction.run(JdbcActionComponent.scala:32)
    at slick.driver.JdbcActionComponent$SimpleJdbcDriverAction.run(JdbcActionComponent.scala:29)
    at slick.BACkend.DatabaseComponent$DatabaseDef$$anon$2.liftedTree1$1(DatabaseComponent.scala:237)
    at slick.BACkend.DatabaseComponent$DatabaseDef$$anon$2.run(DatabaseComponent.scala:237)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

演员将每10秒调用相同的方法.但是,我第一次收到这个错误.之后,查询正确执行.我不明白为什么会发生这种情况.在这个示例中,只有一些简单的读操作.但是在我的实际情况下,由于查询失败,有些数据在没有正确处理的情况下会丢失.
这个错误与连接池有关吗?

我想你已经发现了 this的问题.尝试使用lazy val来分析db,这样它只能初始化一次:
object DriverHelper {
  val user = "POSTGRes"
  val url = "jdbc:POSTGResql://192.168.1.50:5432/MyDatabase"
  val password = "password"
  val jdbcDriver = "org.POSTGResql.Driver"
  lazy val db: POSTGResDriver.BACkend.DatabaseDef = Database.forURL(url,driver = jdbcDriver)
}

大佬总结

以上是大佬教程为你收集整理的使用Slick执行并发查询时,postgresql – NullPointerException异常全部内容,希望文章能够帮你解决使用Slick执行并发查询时,postgresql – NullPointerException异常所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: