一、Kettle 的 “Use Result Streaming Cursor” 选项
ETL 工具Kettle中, 使用mysql连接的时候, 有一个 “Use Result Streaming Cursor”的选项, 相当于 ((com.mysql.jdbc.Statement)stat).enableStreamingResults(), 这样的话, 每次只取一条数据, 效率很低。
不过, Kettle在配置mysql连接的时候, 高级选项里面将useCursorFetch=true和fetchsize设置了, 按照优先级的关系,会优先使用RowDataCursor。
新版mysql的解决方案
mysql jdbc驱动设置fetchsize 要连接字串里有useCursorFetch=true 才行
jdbc:mysql://127.0.0.1/:3306/test?useCursorFetch=true mysql版本,即驱动版本都在5 以上,就可以使用setFetchSize方法了。测试过了,debug过了.如果无此参数,则只有setFetchSize(Integer.MIN_VALUE); 才有效果,但就是每次rs.next() 取一条了。oracle 一般默认设置10条。
this.statement = connection.prepareStatement(parsedQuery,ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
this.statement.setFetchSize(10);
另外, 在同时出现 useCursorFetch=true 和 ((com.mysql.jdbc.Statement)stat).enableStreamingResults()设置的时候, useCursorFetch有更大的优先级, 这个时候, mysql 的jdbc驱动会使用 RowDataCursor。
二、表输出Prepared statement contains too many placeholders
MySQL的prepared statement只能支持至多65535个占位变量,但原因不详。在批量插入数据时,MySQL的JDBC驱动会将单条的插入语句合并为一条多值的插入语句;而我们导入的数据规模,一条记录有很多列,当导入数据时为1000条记录时,SQL中占位符的数目恰好小于65535;当导入2000条记录时,SQL中点位符的数目已超过65535,语句执行时必然报错。
性能参数:
useServerPrepStmts=false
rewriteBatchedStatements=true
useCompression=true
编码:
characterSetResults=utf8
characterEncoding=utf8
defaultFetchSize=500
useCursorFetch=true
日期格式处理
zeroDateTimeBehavior=convertToNull
三、kettle (表输入)查询MySQL数据 遇到错误:
Unable to get timestamp from resultset at index 125
发现数据中timestamp 类型的值 包含 0000-00-00 或 0000-00-00 00:00:00的时候会出现这个错误
jdbc driver处理日期类型产生的问题,通过下面方式解决:
1、使用date_format函数格式化
2、在jdbc URL链接加入参数(zeroDateTimeBehavior=convertToNull):jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull
3、如果是hibernate可以配置下面参数:
<property name="hibernate.connection.zeroDateTimeBehavior">convertToNull</property>
pan调用ktr的方式
运行一段时间报错:
2022/03/01 07:02:31 - 表输入.0 - Error connecting to database: (using class oracle.jdbc.driver.OracleDriver)
2022/03/01 07:02:31 - 表输入.0 - IO 错误: Connection reset
解决方法,在sh文件中的java 命令行中增加参数:-Djava.security.egd=file:/dev/../dev/urandom