データベースから結果を取得し、個々のレコードをすべて取得してカンマ区切りのファイルに書き込むエクスポーターを作成しています。クエリが異なれば、別の csv ファイルを書き込む必要があるため、別のワーカーが作成されます。まず、タスクを 2 つの異なるアクターに分離しました。Actor1 は、クエリ パラメータを指定してデータベースをクエリする JdbcWorker であり、Actor2 は、CSV に追加する必要があるクエリからの結果を表すケース クラスを受け取る CSVWriter です。私の最初の質問は、これら 2 つのワーカーによって提供される関心の分離が好きですが、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 の慣用句に正しく従っているかどうかはわかりません。また、この場合、例外を処理する適切な方法は何でしょうか?
これについていくつかのガイダンスを得ることができれば素晴らしいことです。
ありがとう