一、前言
最近使用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不是一个概念。