python + jdbc 连接 达梦数据库

依赖

  • jpype1=1.5.0
  • jaydebeapi=1.2.3
  • DmJdbcDriver18.jar

启动JVM

def start_jvm():jvm_path = jpype.getDefaultJVMPath()jar_path = ":".join([".....jar",  # 需要python调用的其他jar包".../DmJdbcDriver18.jar"  # 去达梦官网下载])Djava = "-Djava.class.path=" + jar_pathif not jpype.isJVMStarted():jpype.startJVM(jvm_path, Djava, convertStrings=True)  # 需要convertStrings,否则返回变量是java类型的,如java.lang.Integer,没法用python处理if not jpype.isThreadAttachedToJVM():jpype.attachThreadToJVM()

需要注意,在一个python主程序中,一个进程中只能调用一次 startJVM,否则报错:OSError: JVM cannot be restarted

建立连接

def get_db_conn():host = password = username = port = database = jdbc_driver_path = ".../DmJdbcDriver18.jar"jdbc_class_name = "dm.jdbc.driver.DmDriver"url = f'jdbc:dm://{host}:{port}/{database}'conn = jaydebeapi.connect(jdbc_class_name, url, [username, password], jdbc_driver_path)return conn

这个连接是 DB-API 格式,遵循DB-API共同的使用形式:

cur = conn.cursor()
try:cur.execute(sql)conn.commit()
except Exception as e:conn.rollback()
finally:conn.close()

连接池

import jaydebeapi
import jpype
from threading import Semaphore
import loggingclass JConnectionPool:def __init__(self, jdbc_driver_path, jdbc_class_name, jdbc_url, username, password, max_connections=20):self.jdbc_driver_path = jdbc_driver_pathself.jdbc_class_name = jdbc_class_nameself.jdbc_url = jdbc_urlself.conn_properties = {"user": username,"password": password}self.max_connections = max_connectionsself.semaphore = Semaphore(max_connections) # 通过信号量的形式控制连接的数量,也支持Queue方式实现self.connections = []self._initialize_pool()def _initialize_pool(self):if not jpype.isJVMStarted():raise Exception("JVM not started. run `jpype.startJVM` first.")for _ in range(self.max_connections):try:conn = self._create_connection()self.connections.append(conn)except Exception as e:logging.error(f"Failed to initialize connection: {str(e)}")# 验证连接的合法性def _is_connection_valid(self, conn):try:cursor = conn.cursor()cursor.execute("SELECT 1")cursor.close()return Trueexcept Exception:return False# 重新建立连接def _create_connection(self):return jaydebeapi.connect(self.jdbc_class_name, self.jdbc_url, self.conn_properties)# 获取连接,可配置超时时间def get_connection(self, timeout=None):if not self.semaphore.acquire(timeout=timeout):  # 同一时刻只允许self.max_connections个线程调用get_connectionraise Exception("Timeout: Failed to acquire connection from the pool.")try:for conn in self.connections:if self._is_connection_valid(conn):return connelse:new_conn = self._create_connection()self.connections.append(new_conn)return new_connexcept Exception as e:self.semaphore.release()raise Exception(f"Failed to get connection: {str(e)}")# 将连接放回连接池def close_connection(self, conn):try:self.connections.append(conn)except Exception as e:logging.error(f"Failed to close connection: {str(e)}")finally:self.semaphore.release()# 关闭连接池def close_pool(self):for conn in self.connections:try:conn.close()except Exception as e:logging.error(f"Failed to close connection: {str(e)}")self.connections = []

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

富格林:注重虚假阻挠受骗亏损

富格林悉知,贵金属的投资热度,随着近年来愈发紧张的国际形势,而不断攀升,现如今不少投资者进入贵金属市场,但投资都会存在风险,在进行投资时需重视存在的虚假骗局阻挠受害亏损,同时学习正规做单…

SpringMVC项目入门

目录 1. 创建Maven项目 2. 设置项目结构 3.添加SpringMVC依赖 5. 创建控制器类 6. 配置 Deployment Descriptor 7. 运行项目 方法一:更新 Eclipse 插件 方法二:手动下载 XML Schema 文件 问题2: 1. 创建Maven项目 首先,打…

一分钟了解机器人自由度

目录 自由度的定义 自由度的分类 自由度的影响 影响自由度的主要参数 关节类型和数量 机械结构 控制系统 自由度控制的硬件架构原理 传感器 执行器 控制器 通信接口 软件和算法 机器人的自由度是指机器人在空间中可以独立移动的方向和角度的数量,它是衡…

QML Path 路径

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,Path 是一种用于定义和描述路径的元素,通常需要和 Canvas、PathView、Shape 等元素结合一起使用,用于生成复杂的图形或动画效果。 所谓路径,是由一系列路径元素组成的集合,从起点开始,各段…

回滚远程仓库代码

开发过程中遇到合并到远程仓库代码有问题,急需保证线上正常运行,回滚成为唯一选项时,可以使用如下操作。 注意:最重要的一定要保证回滚操作前有备份,总之在做任何可能影响到数据的操作之前,确保你有备份或另…

jenkins参数化构建

Jenkins 的参数化构建 Jenkins 是一个开源的持续集成和持续部署工具,它可以帮助开发者自动化构建、测试和部署软件项目。在本文中,我们将重点介绍如何使用 Jenkins 的参数化构建功能来创建更加灵活和可定制的项目。 参数化构建是 Jenkins 提供的一种强…

html--虎鲸

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>虎鲸</title> <link rel"stylesheet" href"css/normalize.css"> <link rel"stylesheet" href"css/style.css" …

如何理解JVM

JVM&#xff08;Java虚拟机&#xff09;是Java程序的运行环境&#xff0c;它是Java技术的核心组成部分之一。理解JVM涉及到以下几个方面的内容&#xff1a; 1. **虚拟机概念**&#xff1a;虚拟机是一种软件实体&#xff0c;它在物理计算机上模拟出一个计算机系统&#xff0c;使…

查询电脑用户名和组信息

在命令行里查看电脑名&#xff1a; c:\>hostname 在命令行里&#xff0c;查看组信息&#xff1a; # 显示本地所有的用户组 c:\>net localgroup #显示administrators组包含的用户信息 c:\>net localgroup administrators # 比如我的显示信息&#xff1a; C:\>ne…

Linux C++ 029-STL之queue容器

Linux C 029-STL之queue容器 本节关键字&#xff1a;Linux、C、queue 相关库函数&#xff1a;push、pop、back、front queue基本概念 概念&#xff1a;queue是一种先进先出&#xff08;First In Fisrst Out&#xff0c;FIFO&#xff09;的数据结构&#xff0c;它有两个端口 关…

即插即用篇 | YOLOv5/v7引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv5-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…

OpenCV 学习笔记2 C++

1.图像直方图 直方图&#xff08;Histogram&#xff09;是图像处理中常用的工具&#xff0c;它表示图像中每个像素强度值的分布情况。在OpenCV中&#xff0c;可以使用 cv::calcHist 函数来计算图像的直方图。 图像直方图是一种展示图像像素强度分布的统计图表。它显示了图像中…

ES学习日记(十一)-------Java操作ES之基本操作

前言 此篇博客还是一些基础操作&#xff0c;没什么可写的&#xff0c;需要的同学直接抄作业进行测试就可以 上一节写了连接和测试新增操作,这一节写java操作ES的基本操作,也就是增删改查,在这里补充一点知识,我们之前用了指定的索引进行指定添加 有一个情况是,如果我们指定了…

企微自建应用开发-注意事项

1、错误48002 api forbidden&#xff0c;接口无权限 1.1添加ip白名单&#xff0c;ip地址以企微返回值为准 1.2按照规则添加相应权限&#xff0c;例如&#xff1a;【联系我】二维码接口 2、错误60011 no privilege to access/modify contact/party/agent 2.2修改应用可见范围&am…

韩顺平 | 零基础快速学Python(2)

数据容器 容器collections&#xff1a;一种数据类型。可以存放多个数据/元素&#xff0c;可以是任意类型。 相关内置函数函数&#xff1a; round(number, ndigitsNone) 返回number舍入到小数点后ndigits位精度的值&#xff0c;若被省略或为None&#xff0c;则返回最接近如输入…

Java调用WebService,HttpBasicAuth鉴权,wsimport,cxf通通走开

调用webservice接口有好多种方式&#xff0c;比如wsimport生成呀&#xff0c;CXF&#xff0c;JAX-WS&#xff0c;尝试过以后都是各种步骤&#xff0c;各种注意&#xff0c;特别加上鉴权方式不同&#xff0c;搞的复杂N倍&#xff0c;还难排查问题&#xff0c;如果你用到其中某种…

文件下载本地

1、不管什么格式的文件都需要转为字节数组 byte[] 2、再转为各种格式文件的的输出流 3、再转为文件输出流写入本地 注意File生成目录 FileOutputStream为具体全称。

C++ | Leetcode C++题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy new ListNode(0, head);ListNode* first head;ListNode* second dummy;for (int i 0; i < n; i) {first first->next;}while (fi…

【产品】ADW300 无线计量仪表 用于计量低压网络的三相有功电能

1 概述 ADW300 无线计量仪表主要用于计量低压网络的三相有功电能&#xff0c;具有体积小、精度高、功能丰富等优点&#xff0c;并且可选通讯方式多&#xff0c;可支持 RS485 通讯和 Lora、2G、NB、4G 等无线通讯方式&#xff0c;增加了外置互感器的电流采样模式&#xff0c;从…

@Autowired和@component有哪些区别

Autowired 和 Component 是 Spring 框架中的两个不同的注解&#xff0c;它们有不同的作用和用途&#xff1a; Autowired&#xff1a; Autowired 注解用于自动装配&#xff08;注入&#xff09;Spring Bean 的依赖关系。 它可以标记在字段、构造函数、Setter 方法以及方法参数…