在KTor中使用Jetbrains公开库并在协程内部执行数据库事务是否安全?

时间:2019-08-04 20:08:57

标签: kotlin kotlin-coroutines ktor kotlin-exposed

我是Kotlin的新手,最近开始研究Ktor服务器。要执行数据库操作,服务器需要与MySql服务器进行通信。我开始使用JetBrains Exposed库来编写数据库操作。

我编写了一个暂停函数,以使用事务执行代码块(使用“暴露的DSL”编写的数据库查询)。随后是关于ktor入门指南的博客文章。

import re
import cv2
import glob
import numpy as np
from timeit import default_timer as timer

vid = "some_video.avi"

natsort = lambda s: [int(t) if t.isdigit() else t.lower() for t in re.split('(\d+)', s)]

###############################################################################################################

start = timer()
for i in range(50):
    vidcap = cv2.VideoCapture(vid)
    success,image = vidcap.read()
    vframes = []
    while success:
        vframes.append(image[None,:,:,:]) 
        success,image = vidcap.read()
    vframes = np.concatenate(vframes, 0)

end = timer()

print(end - start) ##### ==> 3.720745261060074
###############################################################################################################

start = timer()

for i in range(50):
    iframes = []
    listframes = glob.glob("*.jpg")
    listframes.sort(key=natsort)
    for frame in listframes:
        iframes.append(cv2.imread(frame)[None,:,:,:])
    iframes = np.concatenate(iframes, 0)

end = timer()

print(end - start) ##### ==> 7.264567195205018
###############################################################################################################

每当我需要执行数据库查询时,我都会呼叫

suspend fun <T> dbQuery(block: () -> T): T = withContext(Dispatchers.IO) {
        transaction { block() }
    }

因为Exposed使用线程本地事务管理器以及阻止JDBC驱动程序,所以我想知道这样做是否安全吗?

关于如何使用协程实际处理mysql连接,没有好的文档。

如果这是错误的,并且最终将导致交易锁定,则有关如何解决此问题的任何指针都将有所帮助。

1 个答案:

答案 0 :(得分:0)

最新版本的“暴露”中支持协程。

请查看documentation,但是由于Exposed中的协程支持仍处于实验模式,因此文档与代码可能有所不同。