一、说明
oceanBbase社区版使用起来跟mysql几乎一样,连驱动都不需要改,直接使用mysql的驱动就可以。
但是使用时如果有执行时间长的语句会报如下错误
错误:,(4012, 'Timeout, query has reached the maximum query timeout: 10000000(us), maybe you can adjust the session variable ob_query_timeout or query_timeout hint, and try again.')
修改方法:
--设置最长执行时间
在OceanBase数据库中,ob_query_timeout 不能直接设置为无限。查询超时时间必须是一个具体的数值,以微秒(us)为单位。如果你希望设置一个非常长的超时时间,可以将 ob_query_timeout 设置为一个非常大的值,例如几天或几周的时间。
-- 1天 = 24 * 60 * 60 * 1000000 us
SET global ob_query_timeout = 864000000000;
FLUSH PRIVILEGES;
二、代码
# coding=utf-8 import pymysql import time# pip install pymysql==1.0.2 # 测试oceanBase单表插入性能 # oceanBase社区版操作跟mysql几乎没有任何区别 驱动都是使用mysql 迁移起来非常方便 非常平滑try:start_time = time.time() # 记录开始时间connection1 = pymysql.connect(host='192.168.0.100', user='user', password='passwd', database='testdb', port=3306)#oceanBaseconnection2 = pymysql.connect(host='192.168.0.98', user='user', password='passwd', database='oceanBasedb', port=2883)# 操作数据库cursor1 = connection1.cursor() # 创建一个游标# 操作数据库cursor2 = connection2.cursor() # 创建一个游标# 定义SQL查询语句,使用%s作为参数占位符sql = "SELECT ID,NAME,CONTENT,CREATE_TIME FROM DB_TEST_T"for i in range(80):# 执行SQL查询cursor1.execute(sql)# 获取查询结果rows = cursor1.fetchall()data_to_insert = []for row in rows:# 插入数据到数据表的sql语句insert_data_sql = """insert into DB_TEST_T(ID, NAME, CONTENT, CREATE_TIME)values(%s, %s, %s, %s );"""data = (row[0], row[1], row[2], row[3] ) data_to_insert.append(data)batch_size = 500000for i in range(0, len(data_to_insert), batch_size):batch = data_to_insert[i:i + batch_size]# 批量插入cursor2.executemany(insert_data_sql, data_to_insert)connection2.commit() # 提交事务end_time = time.time() # 记录结束时间execution_time = end_time - start_time # 计算执行时间print(f"Function execution took {execution_time} seconds")except pymysql.Error as e:print(f'错误:,{e}')
完整测试代码获取:
(1)登录-注册:http://resources.kittytiger.cn/
(2)搜索:国产数据库oceanBbase,达梦,金仓与mysql数据库的性能对比