一、前言

最近使用kettle从db2导出数据到mysql,测试好好的,结果生产上报错-1060,08004;于是就想写个java试试行不行,会不会是账号密码、数据库错误、或者是数据库连接jar包不兼容的问题。

以下是java使用db2jcc4-9.7.0.6.jar连接db2数据库、执行sql的代码样例。(普通java程序,只用到这1个jar包)

二、代码样例

import com.ibm.db2.jcc.DB2ConnectionPoolDataSource;
import javax.sql.PooledConnection;
import java.sql.Connection;
import java.sql.PrepareStatement;
import java.sql.ResultSet;

public class Main{
  private static final String ip = "10.123.123.123";
  private static final int port = 50000;
  private static final String username = "abc";
  private static final String password = "mypass";
  private static final String dbname = "mydb";
  private static final String sql = "select * from company where id = '001'";

  public static void main(String[] args){
    System.out.println("begin");
    try{
      DB2ConnectionPoolDataSource db2 = new DB2ConnectionPoolDataSource();
      //重要,有这句就不报错了
      //好像有这句就不用写Class.forName(“COM.ibm.db2.jcc.DB2Driver”);了
      db2.setDriverType(4);
      db2.setServerName(ip);
      db2.setLoginTimeout(10000);
      
      db2.setDataSourceName(ip);
      db2.setPortNumber(port);
      db2.setUser(username);
      db2.setPassword(password);
      db2.setDatabaseName(dbname);
      
      PooledConnection pooledConnection = db2.getPooledConnection();
      Connection connection = pooledConnection.getConnection();
      PreparedStatement ps = connection.prepareStatement(sql);
      ResultSet rs = ps.exectueQuery();
      
      while(resultSet.next()){
        System.out.println(resultSet.getString(1));
      }

      System.out.println("success");
      
    }catch(Exception e){
      System.out.println("error");
      System.out.println(e);
    }
    System.out.println("end");
  }

}

三、总结

1.上面的代码是一个简单的java连接db2的代码,当时主要用来测试是否是用户名密码、数据库名称、或数据库连接jar包有问题,导致了kettle执行失败。
2.使用db2.setDriverType(4)之后,就不需要Class.forName("COM.ibm.db2.jcc.DB2Driver")这句话加载驱动类了。

四、其它笔记

1.sqlcode=-1060 sqlstate=08004错误表示用户没有权限。

2.打jar包前,注意在MANIFEST.MF文件中配置Class-Path,然后执行jar包时才能找到依赖,否则会报错。

(1)例如,MANIFEST.MF如下:

Manifest-Version: 1.0
Class-Path: ./db2jcc4-9.7.0.6.jar 
Main-Class: Main

(2)主类是Main.java,打完包生成main.jar(依赖db2jcc4-9.7.0.6.jar)

(3)把main.jar放到C:\下,把db2jcc4-9.7.0.6.jar也放到C:\下。

(4)使用java -jar C:\main.jar启动main.jar;由于配置了Class-Path,并且db2jcc4-9.7.0.6.jar在对应路径,因此可以成功启动。

3.百度搜不到的问题,可以试试bing搜索(国际版);当然如果有外网能搜索就更好了。

4.db2参数schema与database与user的区别
Oracle中,schema与user是同一个概念;
Mysql中,schema与database是同一个概念;
db2中,schema与database与user都不是同一个概念。

背景原因
●Oracle数据库是数据库本身管理用户的,即每一个要访问Oracle的用户都必须先在Oracle数据库里创建用户;而DB2并没有自己的用户帐号,DB2使用的是操作系统的帐号,DB2只需要对相应的操作系统账户进行授权,则该操作系统账户就可以访问DB2数据库。

●MySql中,下方sql:

select * from a.usertable;

其中,a是schema(纲要),也是database的名称;意思是查询a库的usertable表。

●DB2中,下方sql:

select * from a.usertable;

其中,a是schema(纲要),但不是database的名称,也不是用户;意思是查询某个库里的纲要为a里的usertable表;数据库连接url中配置的才是数据库名。

●DB2需要的参数样例:

数据库ip: 10.123.123.123
数据库名: dbname
用户名: user1
密码: user1
schema(纲要名): sname
表名: usertable

与mysql相比,多了schema;注意schema与database不是一个概念。