我正在编写一个导出器,它将从数据库中获取结果并获取每个单独的记录并将其写入逗号分隔的文件。不同的查询将为其创建不同的工作人员,因为它们需要编写单独的 csv 文件。首先,我将任务分解为两个不同的参与者。Actor1 是一个 JdbcWorker,它通过一个查询参数查询数据库,而 Actor2 是一个 CSVWriter,它接收代表查询结果的案例类,该查询需要附加到 CSV 中。我的第一个问题是,尽管我喜欢这两个工作人员提供的关注点分离,但是将 jdbc 查询与 CSV 编写器分离是一种好的设计吗?
所以,我写了actor1如下:
class DataQueryWorker(csvExporterWorker: ActorRef) extends Actor with ActorLogging{
private implicit def ModelConverter(rs: ResultSet): QueryModel = {
QueryModel(
id = rs.getString(0),
name = rs.getString(1),
age = rs.getString(2),
gender = rs.getString(3))
}
private def sendModelToCsvWorker(model: QueryModel): Unit = {
csvExporterWorker ! model
}
private def startExport[T](queryString: String)(resultFunc: T => Unit)(implicit ModelConverter: ResultSet => T): Unit = {
try {
val connection = DriverManager.getConnection(DbConfig.connectionString,
DbConfig.user,
DbConfig.password)
val statement = connection.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY)
statement.setFetchSize(Integer.MIN_VALUE)
val rs = statement.executeQuery(queryString)
while (rs.next()) {
resultFunc(ModelConverter(rs))
}
} catch {
case e: Exception => //What to do in case of an exception???
}
}
override def receive() = {
case startEvent => startExport(DbConfig.ModelExtractionQuery)(sendModelToCsvWorker)
}
}
我的下一个问题是,上面编写的代码是查询数据库、将其包装在模型中并将结果发送到 CSVWorker 的正确方法吗?我不确定我是否正确地遵循了 scala 习语。另外,在这种情况下处理异常的正确方法是什么?
在这方面获得一些指导会很棒。
谢谢