微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在与AS400 DB2和zOS DB2数据库建立后续连接时,如何解决Class Not Found错误?

如何解决在与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

这是我编写的从zOS上的DB2数据库提取数据的功能

 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))

这是我编写的从AS400上的DB2数据库提取数据的功能

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?