我使用JNDI方法将多个MySQL数据库服务器与我的Pentaho PDI(CE 5.0.1)连接起来,到目前为止工作良好,不包括一个。其中一个MySQL服务器出现故障,所以我更改了JNDI连接(…\data-integration\ssimple JNDI\jdbc.properties)以连接到新服务器,但Kettle没有重新配置此更改,并抛出如下错误:
连接到数据库[db name]时出错:org.pentaho.di.core.exception.KettleDatabaseException:尝试连接到数据库时出错无效的JNDI连接kidr_db_5:无法创建到数据库服务器的连接。尝试重新连接3次。放弃。org.pentaho.di.core.exception.KettleDatabaseException:尝试连接到数据库时出错无效的JNDI连接kidr_db_5:无法创建到数据库服务器的连接。尝试重新连接3次。放弃
我可以通过Native(JDBC)连接方法直接从Kettle连接到新服务器,但不能仅通过此新服务器的JNDI连接。来自JNDI的Rest DB连接工作正常。请告诉我这里怎么了?是不是错过了什么?还是一只虫子?
我已经解决了这个问题,很抱歉最近回复了。问题是,密码中包含了一些特殊字符,包括#符号;但在Pentaho中,#是一条评论行,所以密码的一部分似乎是Pentaho的评论。
因此,结论是,在JNDI配置或Kettle配置文件中,除了注释之外,不要使用#。
快速信息。不完全是Kettle Pentaho虫。Bug(如果不是故意制造的)在"simplejndi"库中。Kettle使用Library simple jndi来提供jndi上下文。java.util.Properties类的oracle文档(http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html)声明,注释行必须以'#'符号开始,并且它必须是该行中的第一个符号,库"simple jndi"-使用自己的加载器,名为org.osjava.sj.loader.util.CustomLoader。这就是错误所在的
int idx = line.indexOf('#');
// remove comment
if(idx != -1) {
line = line.substring(0,idx);
}
因此,如果你使用简单的jndi,注释就是行中"#"符号之后的所有内容。
使用.xml而不是.properties
<?xml version="1.0" encoding="UTF-8"?>
<something>
<connection-name>
<type>javax.sql.DataSource</type>
<driver>org.postgresql.Driver</driver>
<url>jdbc:postgresql://localhost:5432/database</url>
<user>user</user>
<password>#secret#</password>
</connection-name>
</something>
我的文件名为connections.xml然后您可以引用connections/something/connectionname在上述示例的pdi中