shell 脚本环境中的连接池

connection pooling in shell scripts environment

我有一个基本上基于 shell 脚本构建的工具,每次测试运行时,单个 shell 脚本 (SqlCmd.sh) 连接到一个用于执行各种操作(select、插入、更新...等)的单个 DB(通过 sqlplus)。

所以,数据库连接有时没有准确关闭...

我想要的是在所有 sql 操作中建立一个稳定的连接,并避免脏数据库连接。

我正在尝试使用 python 连接池概念实现 SQL 数据库处理,该概念建立数据库连接并具有连续的数据库连接,但我不确定 shell 脚本可以从 python 连接池调用,如果可行的话!

有没有其他方法可以解决这个问题并在我的环境中建立稳定的数据库连接。 如果需要任何其他信息,请告诉我。

提前致谢!

使用 coproc

您可以 运行 OracleDB 客户端作为后台 IO 进程,以便仅启动一个连接,并保持它们打开直到脚本结束。

类似于:

coproc sqlplus -with args -to -connect DB
echo >&${COPROC[1]} "SELECT 3*3 as foo;"
while read -t 1 -ru $COPROC answer ;do
    echo "$answer"
done

...开始。

那么为了避免无用的超时(read -t 1),你可以准备一些边界。

不幸的是(或希望)我不知道 Oracle DB。

诀窍是在答案机制中使用column header来做一个边界提示,然后在收到边界后停止阅读答案:

echo >&${COPROC[1]} "$SqlQuery;"'SELECT date(now) as `myBoundary`;'
while read -ru $COPROC answer ;do
    [ "$anser" = "myBoundary" ] && break
     ...
done
read -ru $COPROC lastAnswerDate

我已经在 shell_connector.sh 上发布了完整的样本。该脚本可以 来源 以使用 newConnector 功能,或者只是 运行 看一个小演示,使用 sqlite,实际操作。

此脚本可以与 sqlitemariadbpostgreSQL 一起使用。如果您成功为 OracleDB 创建了一个新的连接器,请随时分享!

使用简单的一种方式 fd

如果您的脚本没有从您的 sql 客户端读取任何内容,您可以使用单个 fifo,然后向它们写入后续请求:

mkfifo /path/to/mysqlfifo
exec sqlplus -with options </path/to/mysqlfifo &
SQLPLUSPID=$!

那你可以用很多时间:

echo >/path/to/mysqlfifo "SELECT count(*) FROM SYNC_JOB WHERE STATUS IN('R', 'P');"

...

echo >/path/to/mysqlfifo "UPDATE SYNC_JOB set status='S' WHERE STATUS in('R', 'P')"

别忘了

echo >/path/to/mysqlfifo "quit;" # Or exit command regarding to your client's syntax

kill $SQLPLUSPID

下你可以避免外部fifo

exec {SQLCLNT}> >(exec sqlplus -with options)
SQLPLUSPID=$!

那你可以用很多时间:

echo >&$SQLCLNT "SELECT count(*) FROM SYNC_JOB WHERE STATUS IN('R', 'P');"
...
echo >&$SQLCLNT "UPDATE SYNC_JOB set status='S' WHERE STATUS in('R', 'P')"

一旦完成

echo >&$SQLCLNT "\q"
kill $SQLPLUSPID