如何解决在与AS400 DB2和zOS DB2数据库建立后续连接时,如何解决Class Not Found错误?
我是一名测试员。作为测试的一部分,我必须从两个DB2数据库中提取数据。一个驻留在z / OS上,另一个驻留在AS400上
当我依次调用函数时,第二个函数均失败并出现TypeError:“ Class com.ibm.db2.jcc.DB2Driver”或“ com.ibm.as400.access.AS400JDBCDriver”,无论调用该函数的顺序如何
能否请您帮助我理解为什么第二个语句中的jaydebeapi.connect语句由于未找到类而失败?我是否忘记关闭某些东西(我使用上下文管理器进行连接)?
单独地,这些功能可以正常工作。但是,当我一个接一个地打电话时,第二个失败了。请帮忙。
Python版本:3.7.0 JayDeBeApi == 1.2.3 JPype1 == 1.1.2
def query_zos_db2_database(hostname,port,database,username,password,sql_stmt,output_file_path,delimiter="|",header_flag=True):
"""
Function to connect to a DB2 database hosted on z/OS Mainframe
:param hostname:
:param port:
:param database:
:param username:
:param password:
:param sql_stmt:
:param output_file_path:
:param delimiter:
:param header_flag:
:return:
"""
my_name = "query_zos_db2_database()"
st = timeit.default_timer()
print("Entered :{}".format(my_name))
curr_dir = os.getcwd()
jar_file_path = "{}/../drivers/db2jcc/db2jcc4.jar".format(curr_dir)
jar_file_path = os.path.abspath(jar_file_path)
print(jar_file_path)
if not os.path.exists(jar_file_path):
logger.error("File not found: {}".format(jar_file_path))
exit(1)
list_credentials = list()
list_credentials.append(username)
list_credentials.append(password)
jdbc_conn_str = "jdbc:db2://{0}:{1}/{2}".format(hostname,database)
print("Before connection isJVMStarted: {}".format(jpype.isJVMStarted()))
with jaydebeapi.connect('com.ibm.db2.jcc.DB2Driver',jdbc_conn_str,list_credentials,jar_file_path) as conn:
# print(conn)
cursor = conn.cursor()
cursor.execute(sql_stmt)
print("After connection isJVMStarted: {}".format(jpype.isJVMStarted()))
if os.path.exists(output_file_path):
os.remove(output_file_path)
with codecs.open(output_file_path,'wb',encoding='utf-8') as fout:
csvwriter = csv.writer(fout,delimiter=delimiter,quoting=csv.QUOTE_MINIMAL)
if header_flag is True or header_flag == 'True':
if sys.version_info.major == 2:
column_names = [item[0].encode('utf-8') for item in cursor.description]
print(column_names)
else:
column_names = [item[0] for item in cursor.description]
csvwriter.writerow(column_names)
for row in cursor.fetchall():
try:
if sys.version_info.major == 2:
columns = [unicode(column or '') for column in row]
else:
columns = [str(column or '') for column in row]
out_rec = delimiter.join(columns)
fout.write(u"{}\n".format(out_rec))
except UnicodeEncodeError:
print("UnicodeEncodeError- Skipping this record {}".format(row))
et = timeit.default_timer() - st
print("Exited: {}; Elapsed Time: {} s".format(my_name,et))
def query_as400_db2_database(hostname,header_flag=True):
"""
Function to connect to a DB2 database hosted on AS400 Mainframe
:param hostname:
:param port:
:param database:
:param username:
:param password:
:param sql_stmt:
:param output_file_path:
:param delimiter:
:param header_flag:
:return:
"""
my_name = "query_as400_db2_database()"
st = timeit.default_timer()
print("Entered: {}".format(my_name))
curr_dir = os.getcwd()
jar_file_path = "{}/../drivers/jt400/jt400.jar".format(curr_dir)
jar_file_path = os.path.abspath(jar_file_path)
print(jar_file_path)
if not os.path.exists(jar_file_path):
logger.error("File not found: {}".format(jar_file_path))
exit(1)
list_credentials = list()
list_credentials.append(username)
list_credentials.append(password)
jdbc_conn_str = "jdbc:as400://{};prompt=false;translate binary=true;naming=system".format(hostname)
print("Before connection isJVMStarted: {}".format(jpype.isJVMStarted()))
with jaydebeapi.connect('com.ibm.as400.access.AS400JDBCDriver',jar_file_path) as conn:
# print(conn)
print("After connection isJVMStarted: {}".format(jpype.isJVMStarted()))
cursor = conn.cursor()
cursor.execute(sql_stmt)
if os.path.exists(output_file_path):
os.remove(output_file_path)
with codecs.open(output_file_path,et))
解决方法
对于那个特定的错误情况,有两个潜在的错误原因。
1- 通常在 Java 世界中,当我们没有将 jar 文件的路径添加到 CLASSPATH 环境变量时会引发 java.lang.RuntimeException: Class driverClassName not found
异常,而这正是我们试图解释的内容 here>
2-(最有可能的)好像 Jaydebeapi 不支持同时为不同的数据源建立多个连接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。