【ETL】Kettle连接MySQL疑难问题及解决技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zougen/article/details/84975410

1. 指定驱动

一般来说,为了方便配置,在kettle中新建mysql连接时,都选择Native(JDBC)方法,这种方法虽然快捷,但是不能指定驱动类型,而且kettle默认使用的是org.gjt.mm.mysql.Driver,而mysql 8.0以上connector已经不再支持这个包名,所以,会出现明明已经将mysql-connector-java-8.0.xx.jar包拷贝到lib目录下,但还是报错说找不到驱动,这时只能用jndi方法设置kettle使用com.mysql.cj.jdbc.Driver作为驱动。
data-integration\simple-jndi目录下有文件jdbc.properties在此文件中新建jndi配置:

mysql_test/type=javax.sql.DataSource
mysql_test/driver=com.mysql.cj.jdbc.Driver
mysql_test/url=jdbc:mysql://your-host:3306/your-db?useUnicode=true&characterEncoding=utf-8&disableMariaDbDriver
mysql_test/user=user-name
mysql_test/password=your-password

如上设置后,重启kettle,新建数据库连接,选择mysql数据库,选择jndi,在左边JNDI名称中填入mysql_test,完成配置,之后kettle就会使用com.mysql.cj.jdbc.Driver作为驱动。
在这里插入图片描述

注意:
(1)在MySQL新版本中,com.mysql.jdbc.Driver已经废弃,应使用新类名com.mysql.cj.jdbc.Driver
(2)如果同时要连接mariadb和mysql数据库,会出现mariadb和mysql数据库驱动并存的情况,一般来说jdbc:mysql会优先使用mariadb的驱动,所以这里如果要使用mysql驱动,必须加上选项disableMariaDbDriver,禁止使用mariadb驱动来连接mysql数据库
参考:
Having MariaDB and MySQL Drivers in the Same Classpath
Since MariaDB aims to be a drop-in replacement for MySql, the driver permits connection strings beginning with “jdbc:mariadb” or “jdbc:mysql”. To permit having the MySQL and MariaDB drivers on the same classpath, since version 1.5.9, the MariaDB driver doesn’t accept connection strings beginning with “jdbc:mysql” if the “disableMariaDbDriver” option is set.
jdbc:mysql://localhost:3306/db?user=someUser&disableMariaDbDriver won’t be accepted by the MariaDB driver, permitting having MySQL and MariaDB in the same classpath without interfering.

2. AS关键字不起作用或者报错

SELECT id AS myid FROM test

一般来说返回的结果列名应该是myid,但是有时候返回的却是id
这个bug在pentaho的jira上有:
https://jira.pentaho.com/browse/PDI-6745
官方认为是因为驱动版本与数据库版本不匹配导致的,但是很多人在更改驱动版本后,问题依然存在,这是因为kettle的缓存没有清除。
关闭kettle,在以下目录中找到.kettle目录:
Unix: ~/.kettle
Windows: %USERPROFILE%/.kettle
.kettle目录下将所有db.cache-xx-xx文件删除

kettle的db.cache的详细解释:
http://ramathoughts.blogspot.com/2010/08/dealing-with-kettle-dbcache.html

3. Pentaho Server服务器上配置JNDI

在服务器上,目录pentaho-server\pentaho-solutions\system\simple-jndi下也有jdbc.properties文件,这是个误导,服务端的JNDI并不在这里设置。
Pentaho Server上的JNDI在tomcat或者jboss中设置,这里只介绍tomcat的设置方法:
一般来说配置的JNDI只提供给pentaho server用,这样就不用更改tomcat的全局设置,在
pentaho-server/tomcat/webapps/pentaho/WEB-INF/web.xml中设置资源引用:

<resource-ref>
    <description>your-jndi-name</description>
    <res-ref-name>jdbc/your-jndi-name</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

然后在pentaho-server/tomcat/webapps/pentaho/META-INF/context.xml中配置资源:

<Resource name="jdbc/your-jndi-name" auth="Container" type="javax.sql.DataSource"
  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
  maxActive="30" 
  maxIdle="10" 
  minIdle="5" 
  maxWait="100000" 
  initialSize="5" 
  testWhileIdle="true"
  testOnBorrow="true" 
  testOnReturn="false" 
  validationQuery="SELECT 1" 
  validationInterval="30000" 
  timeBetweenEvictionRunsMillis="30000" 
  maxAge="14400000"
  username="your-username" password="your-password" 
  driverClassName="com.mysql.cj.jdbc.Driver" 
  url="jdbc:mysql://host-address:3306/your-db-name?useUnicode=true&amp;characterEncoding=utf-8&amp;disableMariaDbDriver"/>

在kettle中使用JNDI时直接填your-jndi-name,不用填jdbc/your-jndi-name
testWhileIdle,testOnBorrow,validationQuery等选项不能忽略,不然长期运行可能报错,具体解释请看另一篇博文:https://blog.csdn.net/zougen/article/details/85046958
&符号必须用&amp;转义不然会报错"characterEncoding" 的引用必须以 ';'结束

展开阅读全文

没有更多推荐了,返回首页