一般来说,为了方便配置,在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.
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
在服务器上,目录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-namedescription>
<res-ref-name>jdbc/your-jndi-nameres-ref-name>
<res-type>javax.sql.DataSourceres-type>
<res-auth>Containerres-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&characterEncoding=utf-8&disableMariaDbDriver"/>
在kettle中使用JNDI时直接填your-jndi-name
,不用填jdbc/your-jndi-name
。
testWhileIdle,testOnBorrow,validationQuery等选项不能忽略,不然长期运行可能报错,具体解释请看另一篇博文:https://blog.csdn.net/zougen/article/details/85046958
&
符号必须用&
转义不然会报错"characterEncoding" 的引用必须以 ';'结束