我正在編寫一個導出器,它將從數據庫中獲取結果並將每個記錄寫入逗號分隔文件。不同的查詢將爲其創建不同的工作者,因爲他們需要編寫單獨的csv文件。首先,我將任務分解爲兩個不同的角色。 Actor1是一個JdbcWorker,用於查詢數據庫提供的查詢參數,Actor2是一個CSVWriter,它接收表示需要附加到CSV的查詢結果的大小寫類。我的第一個問題是,儘管我喜歡這兩個工作人員提供的關注點的分離,但將jdbc查詢從CSV編寫器中解耦出來的設計很好嗎?scala + jdbc + case class + actors設計混淆
所以,我寫了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習語。另外,在這種情況下處理異常的正確方法是什麼?
這將是很好的一些指導。
謝謝
有一點要注意的在你目前的IMPL是要打開一個連接,但不關閉它。一定要關閉它,否則最終會在數據庫服務器上累積連接。 – cmbaxter 2013-05-08 12:03:26