【问题标题】:Problem Classpath for jaydebeapi from raspberry来自覆盆子的 jaydebeapi 的问题类路径
【发布时间】:2019-11-12 06:31:39
【问题描述】:

我尝试从 Raspberry pi 在 python 中发出 Oracle 请求。问题是:

"Oracle 不支持树莓派使用的 ARM CPU 架构。您下载并解压了 Oracle Instant Client,但它实际上无法运行。没有 Oracle 客户端库,cx_oracle 将无法工作,也不会通用 Python ODBC 连接器。”

信息:

Apache Maven 3.2.5 
Maven home: /opt/apache-maven-3.2.5
Java version: 1.8.0_212, vendor: Raspbian
Java home: /usr/lib/jvm/java-8-openjdk-armhf/jre
Default locale: fr_FR, platform encoding: UTF-8
OS name: "linux", version: "4.19.42-v7+", arch: "arm", family: "unix"

ojdbc6.jar的位置是:

/home/pi/ojdbc6.jar

我需要 python,所以安装了 JPype 和 JayDeBeApi,我在 jupyter notebopok 上写了这个:

import jaydebeapi
import jpype
import os
conn= jaydebeapi.connect('oracle.jdbc.driver.OracleDriver',
'[admin]/[root]@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=helloworld.com)(PORT=1521))(CONNECT_DATA=(SID=hello42)))',
'/home/pi/ojdbc6.jar')

但我有这个错误:

---------------------------------------------------------------------------
java.lang.RuntimeExceptionPyRaisable      Traceback (most recent call last)
<ipython-input-12-2085c24bdf88> in <module>
----> 1 conn=jaydebeapi.connect('oracle.jdbc.driver.OracleDriver','[admin]/[root]@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=helloworld.com)(PORT=1521))(CONNECT_DATA=(SID=hello42)))','/home/pi/ojdbc6.jar')

/usr/local/lib/python3.5/dist-packages/jaydebeapi/__init__.py in connect(jclassname, url, driver_args, jars, libs)
    379     else:
    380         libs = []
--> 381     jconn = _jdbc_connect(jclassname, url, driver_args, jars, libs)
    382     return Connection(jconn, _converters)
    383 

/usr/local/lib/python3.5/dist-packages/jaydebeapi/__init__.py in _jdbc_connect_jpype(jclassname, url, driver_args, jars, libs)
    188             return jpype.JArray(jpype.JByte, 1)(data)
    189     # register driver for DriverManager
--> 190     jpype.JClass(jclassname)
    191     if isinstance(driver_args, dict):
    192         Properties = jpype.java.util.Properties

/usr/local/lib/python3.5/dist-packages/jpype/_jclass.py in JClass(name)
     71     jc = _jpype.findClass(name)
     72     if jc is None:
---> 73         raise _RUNTIMEEXCEPTION.PYEXC("Class %s not found" % name)
     74 
     75     return _getClassFor(jc)

java.lang.RuntimeExceptionPyRaisable: java.lang.RuntimeException: Class oracle.jdbc.driver.OracleDriver not found

我认为问题出在类路径上,但我仍然是初学者。要输入什么命令来配置它?

提前谢谢你!

【问题讨论】:

  • 您在问题中包含的以Oracle does not support the ARM CPU architecture which the Raspberry Pi uses 开头的初始消息来自哪里?这似乎意味着您无法从基于 ARM CPU 的机器(例如 Raspberry Pi)连接到 Oracle 数据库。 ???

标签: java python oracle raspberry-pi jaydebeapi


【解决方案1】:

我很确定 '/home/pi/ojdbc6.jar' 目前被视为 driver_args 而不是 jars 变量.

正确方法:

conn=jaydebeapi.connect('oracle.jdbc.driver.OracleDriver',
'[admin]/[root]@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=helloworld.com)(PORT=1521))(CONNECT_DATA=(SID=hello42)))',
jars='/home/pi/ojdbc6.jar')

或者,您可以手动将 Oracle 轻客户端 jar 添加到 jpype 类路径。

jpype.startJVM(jpype.getDefaultJVMPath(), '-Djava.class.path=/home/pi/ojdbc6.jar'
conn=jaydebeapi.connect('oracle.jdbc.driver.OracleDriver',
'[admin]/[root]@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=helloworld.com)(PORT=1521))(CONNECT_DATA=(SID=hello42)))')

【讨论】:

  • 我试过了,但我收到了这条消息:“oserror jvm 已经启动”:o 我明天再试一次,谢谢你的帮助!
  • 知道了。实际上,如果 JVM 已经启动,则不会将类加载到类路径中。找到启动 JVM 的位置(可以是显式调用 jpype 或其他东西,例如 jaydebeapi.connect(..) )并对类路径。
  • 如果您愿意,请查看github.com/baztian/jaydebeapi/blob/master/jaydebeapi/… 的源代码,它实际上解释了正在发生的一切。
  • 你的“正确方法”代码给了我这个:python java.sql.SQLExceptionPyRaisable: java.sql.SQLException: No suitable driver found for [admin]/[root]@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=helloworld.com)(PORT=1521))(CONNECT_DATA=(SID=hello42))) 这是 sql 错误吗?
  • 很可能是访问数据库有问题。请确保正确指定了所有凭据(第二个 connect(..) 参数)并且数据库已启动并正在运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多