博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql asyn 示例
阅读量:5338 次
发布时间:2019-06-15

本文共 4214 字,大约阅读时间需要 14 分钟。

这篇文章摘自mysql asyn作者的博客,

 

开头有一个简单示例,然后是一个在play上的应用。例子我并没有跑过,但是仍能学到不少东西。

object BasicExample {    def main(args: Array[String]) {        // 这个Parser我发现好像用不了。。        val configuration = URLParser.parse("")        val connection: Connection = new PostgreSQLConnection(configuration)        //阻塞等待连接        Await.result(connection.connect, 5 seconds)        //sendQuery直接就执行了,不像slick那样,还要单独的run        val future: Future[QueryResult] = connection.sendQuery("SELECT * FROM USERS")        val mapResult: Future[Any] = future.map(queryResult => queryResult.rows match {            case Some(resultSet) => {                val row: RowDat = resultSet.head                row(0)            }            //注意,这里的-1是Any而不是Future[Any]            case None => -1        })        val result = Await.result(mapResult, 5 seconds)        println(result)        //关闭数据库链接        connection.disconnect    }}

The basic usage pattern is quite simple, you ask for something, you get a future[_] back. The PostgreSQLConnection is a real connection to database. it implements the Connection trait and you should try to use the trait as much as possible. 

When you create a connection handler, it's not connected to the db yet, you have to connect it yourself calling connect and waiting for the future to return or composing on the future to do something else.

 

下面是一个play app. 包括MVC模型。因为Controller牵扯了太多play的知识,我就暂时不抄了,只把持久化部分写上。

这个持久化实现了ResultSet到case class的mapping,虽然是手动进行的,但是写的非常好。如果能使用implicit写mapping应该会更加优雅。

此外,一个play app应该选用connection pool而不是每次用到数据库都重新建立连接。下面给出了用法。

// 需要提前创建好数据库,id应该是自增的case class Message(id: Option[Long], content: String: LocalDate = LocalDate.now())object MessageRepository {    val Insert = "INSERT INTO messages (content, moment) VALUES(?, ?)"    val Update = "UPDATE messages SET content = ?, moment = ? WHERE id = ?"    val Select = "SELECT id, content, moment FROM messages ORDER BY id asc"    val SelectOne = "SELECT id, content, momment FROM messages WHERE id = ?"}// 这个有点dependency injection的意思class MessageRepository(pool: Content) {    import MessageRepository._    def save(m: Message): Future[Message] = {        // queryResult => m 是什么意思        case Some(id) => pool.sendPreparedStatement(Update, Array(m.content, m.moment, id)).            map { queryResult => m }        case None => pool.sendPreparedStatement(Insert, Array(m.content, m.moment)).            map { queryResult => m }    }    def list: Future[IndexSeq[Message]] = {        pool.sendQuery(Select). map {            //rows 返回resultSet, get返回什么呢,返回的是 Iterator 类型的东西么            queryResult => queryResult.rows.get.map {                item => rowToMessage(item)            }        }    }    def find(id: Long): Future[Option[Message]] = {        //[Any] 非得加么        pool.sendPreparedStatement(SelectOne, Array[Any](id)).map {            queryResult =>                queryResult.rows match {                    case Some(rows) =>                         Some(rowToMessage(rows.apply(0)))                    case None => None                }        }    }    private def rowToMessage(row: RowData): Message = {        new Message(            id = Some(row("id".asInstanceOf[Long]))            content = row("content").asInstanceOf[String]            moment = row("moment").asInstanceOf[LocalDate]        )    }}

 

对于mysql的每一张表,都应该有一个这样的插入语句,对于多表join的情况,可能要单独处理吧。

上面实现了DAO,下面一小段代码可以充当配置文件来用,相当于dependency injection

object Global extends GlobalSettings {    private val databaseConfiguration = System.getenv("DATABASE_URL") match {        case url: String => URLParser.parse(url)        case _ => new Configuration(            username = "postgres"            database = Some("databasename")            port     = 5433        )    }    // factory 还有mysql专用版么    private val factory = new PostgreSQLFactory(databaseConfiguration)    private val pool    = new ConnectionPool(factory, PoolConfiguration.Default)    val messageRepository = new MessageRepository( pool )//    play 的东西,普通的程序不晓得如何处理close问题    override def onStop(app: Application)        pool.close}

对于一般的程序,用connectionPool要好一点,但是要注意,不能直接在connectionPool上应用transacation。当需要用到transacation时,从connectionPool中获取一个connection,还要记得还回去。

 

转载于:https://www.cnblogs.com/xinsheng/p/4335919.html

你可能感兴趣的文章
Android开发中 .9.png格式图形设计:
查看>>
Linux常见命令
查看>>
ASP.NET Page执行顺序如:OnPreInit()、OnInit()
查看>>
linux下编译安装nginx
查看>>
adb命令
查看>>
SQL自定义排序 ORDER BY
查看>>
Modal模态框scrolltop保留上次位移的解决方案
查看>>
python 函数(一)
查看>>
我说我在总结谁会信。。
查看>>
数据库索引的作用和长处缺点
查看>>
Laravel 安装代码智能提示扩展「laravel-ide-helper」
查看>>
java开发配套版本
查看>>
MySQL的 Grant命令权限分配
查看>>
非阻塞的c/s,epoll服务器模型
查看>>
YII框架安装过程总结
查看>>
HDOJ(HDU) 1862 EXCEL排序(类对象的快排)
查看>>
Codeforces Round #381 (Div. 2) 复习倍增//
查看>>
Money类型转化为String去除小数点后0解决方法
查看>>
ArcScene 高程不同的表面无法叠加
查看>>
[ONTAK2010] Peaks
查看>>