DB2 Connection - 在 IBM DataStudio 中工作,但在 java 程序中失败

Posted

技术标签:

【中文标题】DB2 Connection - 在 IBM DataStudio 中工作,但在 java 程序中失败【英文标题】:DB2 Connection - Working from IBM DataStudio but failing from java Program 【发布时间】:2017-04-07 08:00:59 【问题描述】:

我正在尝试使用 JDBC 连接从我的 Windows 机器连接到 DB2 数据库。

我能够使用来自 IBM Data Studio 客户端的相同凭据成功连接,但是当我从 Java 程序尝试相同的凭据时,我得到了以下异常。

com.ibm.db2.jcc.am.io: [jcc][t4][2043][11550][4.7.89] Exception java.net.ConnectException: Error opening socket to server lnx1iitmon05s/XXXXXX on port YYYY with message: Connection refused: connect. ERRORCODE=-4499, SQLSTATE=08001
    at com.ibm.db2.jcc.am.dd.a(dd.java:319)
    at com.ibm.db2.jcc.am.dd.a(dd.java:337)
    at com.ibm.db2.jcc.t4.xb.a(xb.java:378)
    at com.ibm.db2.jcc.t4.xb.<init>(xb.java:76)
    at com.ibm.db2.jcc.t4.a.y(a.java:263)
    at com.ibm.db2.jcc.t4.b.a(b.java:1786)
    at com.ibm.db2.jcc.am.lb.a(lb.java:538)
    at com.ibm.db2.jcc.am.lb.<init>(lb.java:494)
    at com.ibm.db2.jcc.t4.b.<init>(b.java:309)
    at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:214)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:224)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at com.genericframework.db.RRDBConnection.getConnection(RRDBConnection.java:63)
    at com.genericframework.db.RRDBConnection.main(RRDBConnection.java:77)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at com.ibm.db2.jcc.t4.y.run(y.java:34)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.ibm.db2.jcc.t4.xb.a(xb.java:372)
    ... 12 more

这是我的代码..

 try 
            String filename = "com/genericframework/db/RRDBConnection.properties";
            //input = SPARKApp.class.getClassLoader().getResourceAsStream(filename);
            input = getClass().getClassLoader().getResourceAsStream(filename);

            // load a properties file
            prop.load(input);
         catch (FileNotFoundException ex) 
            Logger.getLogger(RRDBConnection.class.getName()).log(Level.SEVERE, null, ex);
         catch (IOException ex) 
            Logger.getLogger(RRDBConnection.class.getName()).log(Level.SEVERE, null, ex);
        

        dbHostName = prop.getProperty("DBHost");
        dbPort = prop.getProperty("DBPort");
        dbDatabasename = prop.getProperty("DBname");
        dbUsername = prop.getProperty("DBUserName");
        dbPassword = prop.getProperty("DBPassword");



        String connectionString = "jdbc:db2://"+dbHostName+":"+dbPort+"/"+dbDatabasename;

        System.out.println(connectionString);
        Connection  connection=null;
        try 
            //Class.forName( "COM.ibm.db2os390.sqlj.jdbc.DB2SQLJDriver");
            Class.forName( "com.ibm.db2.jcc.DB2Driver");
            connection = DriverManager.getConnection(connectionString,dbUsername,dbPassword);

         catch (ClassNotFoundException ex) 
            Logger.getLogger(RRDBConnection.class.getName()).log(Level.SEVERE, null, ex);
         catch (SQLException ex) 
            Logger.getLogger(RRDBConnection.class.getName()).log(Level.SEVERE, null, ex);
        

【问题讨论】:

【参考方案1】:

请尝试以下代码:

        try  
            Class.forName(className);  
            //System.out.println("class not found");  
            con=DriverManager.getConnection(  
                    dbURL,dbName,dbPassword);  
            Statement stmt=con.createStatement(); 

            //your operations like select,insert or update

        catch(Exception e)   
            System.out.println(e.getMessage());
         
        finally 
            con.close(); 
        

并添加maven依赖:

<dependency>
            <groupId>com.ibm.db2.jcc</groupId>
            <artifactId>licences</artifactId>
            <version>1.0</version>
            <!-- Adjust this properly -->
            <scope>system</scope>
            <systemPath>$basedir/lib/db2jcc_license_cu.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>com.ibm.db2.jcc</groupId>
            <artifactId>db2jcc4</artifactId>
            <version>1.0</version>
            <!-- Adjust this properly -->
            <scope>system</scope>
            <systemPath>$basedir/lib/db2jcc4.jar</systemPath>
        </dependency>

或使用以下罐子:

1. db2jcc.jar 
2. db2jcc_license_cu.jar

【讨论】:

【参考方案2】:

使用 DB2 命令窗口中的 db2set DB2COMM 命令启动 TCP/IP 连接:

db2set DB2COMM=protocol_names

例如,要将数据库管理器设置为启动 TCP/IP 通信协议的连接管理器,请输入以下命令:

db2set DB2COMM=tcpip db2stop db2start

【讨论】:

我假设我们应该在数据库服务器上输入这些命令。这是正确的吗?

以上是关于DB2 Connection - 在 IBM DataStudio 中工作,但在 java 程序中失败的主要内容,如果未能解决你的问题,请参考以下文章

IBM DB2认证简介

IBM/DB2.Linux的安装配置管理

未找到指定的 JDBC 驱动程序 com.ibm.db2.jcc.DB2Driver 类

在 ibm db2 中创建数据库时出错

python操作db2和mysql ,ibm_db

IBM DB2 问题--System.BadImageFormatException:无法加载文件或程序集 IBM.DB2.DLL 或其依赖项之一