- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 python 中使用 cx_Oracle 并行运行完全独立的 Oracle 查询。
我可以通过为每个线程设置一个新的数据库连接,然后在每个单独的线程中运行查询来成功地完成这项工作,这使总时间从大约 2 分钟减少到 1 分 20 秒,所以它确实有效。查询时间:
START_TIME END_TIME
17-FEB-16 22.33.28.000000000 17-FEB-16 22.33.30.000000000
17-FEB-16 22.33.30.000000000 17-FEB-16 22.33.33.000000000
17-FEB-16 22.33.33.000000000 17-FEB-16 22.33.36.000000000
17-FEB-16 22.33.36.000000000 17-FEB-16 22.33.36.000000000
17-FEB-16 22.33.36.000000000 17-FEB-16 22.34.08.000000000
17-FEB-16 22.34.08.000000000 17-FEB-16 22.34.26.000000000
17-FEB-16 22.34.26.000000000 17-FEB-16 22.34.27.000000000
17-FEB-16 22.34.27.000000000 17-FEB-16 22.34.29.000000000
然而,在每个线程中设置与数据库的连接会产生开销,我很确定我应该能够为每个线程创建一个新游标并共享连接,如下所示:
http://www.oracle.com/technetwork/articles/vasiliev-python-concurrency-087536.html
然而,当我共享连接并使用单独的游标时会发生什么,查询全部同时开始,然后同时结束,所以看起来就像在生成线程时,在数据库上查询是仍然顺序运行。查询时间:
START_TIME END_TIME
17-FEB-16 22.36.32.000000000 17-FEB-16 22.38.21.000000000
17-FEB-16 22.36.32.000000000 17-FEB-16 22.38.21.000000000
17-FEB-16 22.36.32.000000000 17-FEB-16 22.38.21.000000000
17-FEB-16 22.36.31.000000000 17-FEB-16 22.38.21.000000000
17-FEB-16 22.36.31.000000000 17-FEB-16 22.38.21.000000000
17-FEB-16 22.36.31.000000000 17-FEB-16 22.38.21.000000000
17-FEB-16 22.36.31.000000000 17-FEB-16 22.38.21.000000000
多连接代码:
for file in file_transporter.complete_file_list:
#Get database and open connection
the_db = shared_lib_wrapper.get_oracle().Oracle(the_logger)
the_db .connect(conn_str())
#Create new thread
thread = threading.Thread(target=Loader, args=(params, the_date, the_logger, the_db, file, file_transporter.complete_file_list[file]))
the_logger.info("Running Thread: " + thread.getName())
thread.start()
多游标代码(在 runLoad 中有一个创建新游标并执行过程的函数 - 见下文):
for file in self.file_list:
file_parametes = self.file_list[file]
function_to_run = file_parametes['LOAD_PACKAGE'] + '.' + file_parametes['LOAD_FUNCTION']
#Create new thread
thread = threading.Thread(target=self.runLoad, args=(file_parametes['RUN_ID'], function_to_run))
self.log.info("Spawned Thread: " + thread.getName())
self.log.info("Running Thread: " + thread.getName())
thread.start()
创建游标的代码:
def execute_stored_proc_with_in_and_out_params(self, proc_name, params, dbms_logging=False):
try:
cursor = cx_Oracle.Cursor(self.db_conn
因此我的问题是:
1) 我在创建游标时做错了什么吗? - 如果有关于如何修复它的任何想法,我读过 cx_oracle 是线程安全 2:
Currently 2, which means that threads may share the module and connections, but not cursors.
最佳答案
请看下面,这是一个程序的有效实现,它使用相同的连接,但每个线程中都有一个单独的游标。我调用的过程在 cx_Oracle 测试用例(5.2.1 版本的一部分)中并且非常简单,所以我在示例中多次调用它(每个线程中的一个随机数)。输出清楚地表明线程没有同时完成。
from __future__ import print_function
import cx_Oracle
import datetime
import random
import threading
connection = cx_Oracle.Connection("cx_Oracle/dev", threaded = True)
def TestThread(threadNum):
startTime = datetime.datetime.today()
cursor = connection.cursor()
numInputs = int(random.random() * 5000)
print("Thread", threadNum, "with", numInputs, "inputs:", startTime)
for i in range(numInputs):
value = bool(int(random.random() * 2))
cursor.callfunc("pkg_TestBooleans.GetStringRep", str, (value,))
endTime = datetime.datetime.today()
print("Thread", threadNum, "with", numInputs, "inputs:", endTime)
threads = []
for i in range(8):
thread = threading.Thread(target = TestThread, args = (i + 1,))
threads.append(thread)
thread.start()
print("All threads spawned...waiting for them to complete...")
for thread in threads:
thread.join()
输出如下:
具有 3405 个输入的线程 1:2016-02-22 07:55:07.849127
具有 2706 个输入的线程 2:2016-02-22 07:55:07.849998
具有 4101 个输入的线程 3:2016-02-22 07:55:07.850256
具有 2912 个输入的线程 4:2016-02-22 07:55:07.850937
具有 3747 个输入的线程 5:2016-02-22 07:55:07.851275
具有 4318 个输入的线程 6:2016-02-22 07:55:07.851534
具有 1453 个输入的线程 7:2016-02-22 07:55:07.852649
具有 3304 个输入的线程 8:2016-02-22 07:55:07.853090
所有线程都已生成...等待它们完成...
具有 1453 个输入的线程 7:2016-02-22 07:55:09.897217
具有 2706 个输入的线程 2:2016-02-22 07:55:11.446744
具有 2912 个输入的线程 4:2016-02-22 07:55:11.681414
具有 3304 个输入的线程 8:2016-02-22 07:55:12.016809
具有 3405 个输入的线程 1:2016-02-22 07:55:12.081846
具有 3747 个输入的线程 5:2016-02-22 07:55:12.266111
具有 4101 个输入的线程 3:2016-02-22 07:55:12.375623
具有 4318 个输入的线程 6:2016-02-22 07:55:12.409352
更新:如评论中所述,连接一次仅执行一项事件。因此,尽管在多个线程中使用来自同一连接的多个游标是线程安全,但它实际上并没有提高并发性。为此,您必须使用单独的连接。
关于Python cx_oracle 多线程不适用于每个线程的游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35469431/
我正在尝试使用游标遍历表: DEClARE @ProjectOID as nvarchar (100) DECLARE @TaskOID as nvarchar (100) DECLARE TaskO
使用 JOprionPane 时,光标出现了一些问题。我将光标设置到 pharent 框架,然后使用这个显示一个对话框: Object[] possibilities = {"ham", "spam"
我想将数据从一个表(原始数据,所有列都是 VARCHAR)复制到另一个表(使用相应的列格式进行格式化)。 为了将数据从 rawdata 表复制到 formatted 表中,我使用游标来识别受影响的行。
我先走了 我 100% 属于集合运算阵营。但是当设置逻辑时会发生什么在整个所需的输入域上进行检索会导致如此大的检索,以至于查询显着减慢,变得缓慢,或者基本上需要无限的时间? 在这种情况下,我将使用可能
为什么我不能这样做?我想从 TABLEA 中搜索大于光标值的最接近的值,对两者执行平均函数并将结果放入 test3 中。我收到错误代码 1054 未知列“Xnearest in 'field list
我希望以下存储例程返回一系列行,但它只返回 1: CREATE PROCEDURE example() BEGIN DECLARE current_id INT;
我有一张代表患者体检的表,它有检查 ID 和患者 ID。 我想逐行浏览表格并获取每个患者 ID 并比较其不同的咨询,看看它是否被视为“new_attack”。我正在处理疟疾疾病,我们认为每个在过去 6
如文档所述here ,我需要声明一个在打开时接受参数的游标。 我的查询类似于: DECLARE cur CURSOR (argName character varying) FOR SELECT *
我正在尝试使用 PostgreSQL 学习基本游标。这是我的脚本: DECLARE cur_employees CURSOR FOR SELECT * FROM employee CLOS
*DELIMITER // create procedure test(OUT l_out INT) begin DECLARE done INT DEFAULT FALSE; declare l_s
来自 psycopg2 文档: When a database query is executed, the Psycopg cursor usually fetches all the record
我正在使用 while 循环遍历游标,然后输出数据库中每个点的经度和纬度值。 出于某种原因,它没有返回光标中的最后一组(或第一个取决于我是否使用 Cursor.MoveToLast)经度和纬度值。 这
不知道有没有人试过全新的PHPStorm 4 , 但我遇到了这个新版本的问题,而我以前的主要版本 (PHPStorm 3) 没有。 基本上,当我单击代码 View 空白处的任意位置时,光标会设置在该位
mysql的存储过程、游标 、事务实例详解 下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。 其中,涉及到了存储过程、游标(双层循环)、事务。 【说明】:代码
Mysql的存储过程是从版本5才开始支持的,所以目前一般使用的都可以用到存储过程。今天分享下自己对于Mysql存储过程的认识与了解。 一些简单的调用以及语法规则这里就不在赘述,网上有许多例子。这里
我正在使用 SQL Server,我有一个包含 3 列(时间序列)的表 data ,带日期,hour开始,AwardStatus . 大部分奖励状态是随机生成的。有两种选择,授予或未授予。 但是,业务
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Why am getting duplicate records ? pls correct me.Thanks in Advance. declare clazzes_rec clazzes%r
Why am getting duplicate records ? pls correct me.Thanks in Advance. declare clazzes_rec clazzes%r
我需要在数据表中设置一个非唯一标识符。这在组内是连续的,即。对于每个组,ID 应从 1 开始,并以 1 为增量递增,直到该组的最后一行。 下表对此进行了说明。 “新 ID”是我需要填充的列。 Uniq
我是一名优秀的程序员,十分优秀!