@
zhanlanhuizhang @
ysc3839 有一定的历史原因,因为我们现在有一个库就是用 beego+go-sqlite3 打包成可执行文件当做 android 本地服务器使用的,新版 android 30 限制使用这种方式执行二进制,只能改成 aar 执行。结果性能下降非常严重,相同的数据和 sql 直接调用不管是通过二进制文件( targetVerison<30 )还是通过 android 直接调用都能执行成功,但是影响数据量大的情况下 gomobile+go-sqlite3 构建的 aar 直接报错。
如下例子(打包成 aar ),同一个事务中,修改数据少的 sql 可以执行成功,修改数据多的不能执行成功。
```go
func Test3(dir string, times int) {
fmt.Println("Test3 exec start:", times)
//os.Remove(dir)
os.Chmod(dir, 0777)
//db, err := sql.Open("sqlite3", "file:"+dir+"?mode=rwc")
db, err := sql.Open("sqlite3", dir)
if err != nil {
fmt.Println(err)
}
defer db.Close()
var readOnly string
row := db.QueryRow("PRAGMA query_only")
err = row.Scan(&readOnly)
if err != nil {
fmt.Println(fmt.Sprintf("pragma query_only error:%s", err.Error()))
}
fmt.Println(fmt.Sprintf("pragma query_only:%s", readOnly))
tx, err := db.Begin()
if err != nil {
fmt.Println(err)
}
for i := 0; i < times; i++ {
_, err := tx.Exec(`update table set is_del = 1 where id <101`)
if err != nil {
fmt.Println(fmt.Sprintf("exec1 error:%s", err.Error()))
}
_, err = tx.Exec(`update table set is_del = 1 where is_del = 0 and id not in
(select id from (select max(create_at), id from table where is_del =0 group by a_id,b_idhaving count(*)>0))`)
if err != nil {
fmt.Println(fmt.Sprintf("exec2 error:%s", err.Error()))
}
}
err = tx.Commit()
if err != nil {
fmt.Println(err)
}
fileInfo, err := os.Stat(dir)
if err != nil {
fmt.Println(err)
}
fileMode := fileInfo.Mode()
fmt.Println(fileMode)
//perm := fileMode.Perm()
//fmt.Println("permission:", uint32(perm))
fmt.Println("Test3 exec end:", times)
}
```
```shell
2023-09-22 10:09:28.473 27362-27496 GoLog I Test3 exec start: 1
2023-09-22 10:09:28.476 27362-27493 GoLog I pragma query_only:0
2023-09-22 10:09:28.521 27362-27496 GoLog I exec2 error:disk I/O error: read-only file system
2023-09-22 10:09:28.521 27362-27496 GoLog I cannot commit - no transaction is active
2023-09-22 10:09:28.521 27362-27493 GoLog I -rwxrwxrwx
2023-09-22 10:09:28.521 27362-27493 GoLog I Test3 exec end: 1
2023-09-22 10:09:28.530 27362-27490 Android E Shell Command Output:-rwxrwxrwx 1 u0_a1451 u0_a1451 17772544 2023-09-22 10:03 /data/user/0/packagename/16fc0efec1104515b0244ddae36a4123.db
```