Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接到数据库时,Scala Actors会意外挂起_Sql_Scala_Actor - Fatal编程技术网

Sql 连接到数据库时,Scala Actors会意外挂起

Sql 连接到数据库时,Scala Actors会意外挂起,sql,scala,actor,Sql,Scala,Actor,我对Scala中的标准actor库的理解有问题。在下面的代码中,我创建了一个简单的swing,基本上应该测试它是否能够连接到postgreSQL服务器。然而,它并没有做到这一点,我使用了Actors,因为在执行连接到数据库所需的工作时,UI会冻结。 当我使用这一行时(意思是我使用演员而不是单个线程) Swing将永远不会更新。但是,如果我注释掉这一行并使用接下来的三行。(意味着演员不会被使用) 回转将冻结,但大约25秒后回转将更新 import dbc.Database import dbc.v

我对Scala中的标准actor库的理解有问题。在下面的代码中,我创建了一个简单的swing,基本上应该测试它是否能够连接到postgreSQL服务器。然而,它并没有做到这一点,我使用了Actors,因为在执行连接到数据库所需的工作时,UI会冻结。 当我使用这一行时(意思是我使用演员而不是单个线程)

Swing将永远不会更新。但是,如果我注释掉这一行并使用接下来的三行。(意味着演员不会被使用)

回转将冻结,但大约25秒后回转将更新

import dbc.Database
import dbc.vendor.PostgreSQL
import java.awt.Dimension
import java.net.URI
import java.sql.Connection
import swing.event._
import swing._
import actors.Actor
import java.awt.Color._
import scala.actors.Actor._

case class Info(reply: String)
case class GetInfo()

object Example extends SimpleSwingApplication {
  val pgButton = new Button("Check PostgreSQL")
  val pgText = new TextArea("Not Checked Yet")
  val pgPanel = new GridPanel(1, 2)
  pgPanel.contents += pgButton
  pgPanel.contents += pgText

  def top = new MainFrame {
    title = "StateChecker"
    contents = pgPanel
  }

  listenTo(pgButton)
  reactions += {
    case e: ButtonClicked if (e.source.eq(pgButton)) => {
      PostgresCheck ! new GetInfo()

      //val result = PostgresCheck.checkPostgreSQL
      //if (result == "OK") pgText.background = GREEN else pgText.background = RED
      //pgText.text = result
    }
  }

  val guiActor = new Actor {
    def act() = {
      loop {
        react {
          case e: String => {
            val result = e
            if (result == "OK") pgText.background = GREEN else pgText.background = RED
            pgText.text = result
          }
          case e => println(e.toString)
        }
      }
    }
  }
  guiActor.start
}

object PostgresCheck extends Actor {
  def checkPostgreSQL() = {
    try {
      val db = new Database(myPgSQL)
      val con: Connection = myPgSQL.getConnection // Freezes while doing this method
      val statement = con.createStatement
      if (statement.getResultSet.getMetaData.getColumnCount == 1) "OK"
      else statement.getWarnings.toString
    }
    catch {
      case e => e.toString
    }
  }

  def act() = {
    loop {
      react {
        case e: GetInfo => {
          sender ! new Info(checkPostgreSQL)
        }
      }
    }
  }
  start()
}

object myPgSQL extends PostgreSQL {
  val uri = new URI("jdbc:postgresql://whatever.com")
  val user = "1234"
  val pass = "1234"
}

你似乎是在一个演员之外传递信息。试试这个:

Actor.actor { PostgresCheck ! new GetInfo() }
不确定是否有帮助,但这是标准建议


现在我想起来了,答案会发给谁呢?您正在回复不存在的发件人。我想你想把答案转到guiActor,但我看不到你这么做。

好了,我们开始吧,问题与线路有关

sender ! new Info(checkPostgreSQL)
事实上应该是这样的

Example.guiActor! new Info(checkPostgreSQL)
由于某些与Actor库相关的原因,它在等待数据库连接时实际上会挂起,并且由于未知的发送者而不会返回。例如,以下几行在console中只打印出一行“1”


更改上述行时,代码的行为与预期一致。

应用程序挂起时是否可以转储堆栈跟踪?在windows上,控制台窗口中的CTRL-BREAK在Unix上,
kill-QUIT pid
,其中pid是进程ID。在标准tty设置下,CTRL-\将在Unix和Linux下生成退出信号。您确定PostgresCheck的初始值设定项正在运行吗?(即,如果在
start()
之后加上
println(“Running”)
,你看到了吗?)你有没有在guiActor的react语句中加上它?如果我使用你建议的方式,我不会有什么不同。GUI事件线程只是创建一条消息并将其放入队列,因此它不应该有任何区别。很好,我没有注意到我将回复发送到了错误的地方,“发件人”应该替换为“Example.guiActor”。
sender ! new Info(checkPostgreSQL)
Example.guiActor! new Info(checkPostgreSQL)
      val db = new Database(myPgSQL)
      println("1")
      // Freezes while doing this method
      val con: Connection = myPgSQL.getConnection 
      println("2")