Pentaho 数据集成:与 MS SQL Server 的 jdbc 连接不起作用

Posted

技术标签:

【中文标题】Pentaho 数据集成:与 MS SQL Server 的 jdbc 连接不起作用【英文标题】:Pentaho data integration: jdbc connection to MS SQL Server not working 【发布时间】:2015-10-07 12:17:38 【问题描述】:

使用 Pentaho Data Integration - Kettle 5.0.1 (http://community.pentaho.com/projects/data-integration/) 的社区版,我可以毫无问题地连接到我的 MS SQL Server 2014 数据库,从工具中选择 MS SQL Server,然后选择 Native (JDBC) -?向导 -> 创建数据库连接。

我现在已经升级到最新的 5.4 版本,无法再连接了。

我得到的错误如下。

关于如何解决此问题的任何建议?我感到困惑的是,我无法找到一种方法来告诉 Pentaho jdbc 驱动程序在哪里。例如。我下载了 Microsoft 的 JDBC 驱动程序 (https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774),但如何让 Pentaho 使用它们?我将文件 sqljdbc42.jar 复制到 c:\Pentaho\lib 但无济于事。我也尝试在“通用数据库”选项中使用它,但同样无济于事。

Error connecting to database [c] : org.pentaho.di.core.exception.KettleDatabaseException: 
Error occurred while trying to connect to the database

Error connecting to database: (using class net.sourceforge.jtds.jdbc.Driver)
I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.


org.pentaho.di.core.exception.KettleDatabaseException: 
Error occurred while trying to connect to the database

Error connecting to database: (using class net.sourceforge.jtds.jdbc.Driver)
I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.


    at org.pentaho.di.core.database.Database.normalConnect(Database.java:428)
    at org.pentaho.di.core.database.Database.connect(Database.java:358)
    at org.pentaho.di.core.database.Database.connect(Database.java:311)
    at org.pentaho.di.core.database.Database.connect(Database.java:301)
    at org.pentaho.di.core.database.DatabaseFactory.getConnectionTestReport(DatabaseFactory.java:80)
    at org.pentaho.di.core.database.DatabaseMeta.testConnection(DatabaseMeta.java:2686)
    at org.pentaho.di.ui.core.database.dialog.DatabaseDialog.test(DatabaseDialog.java:109)
    at org.pentaho.di.ui.core.database.wizard.CreateDatabaseWizardPage2.test(CreateDatabaseWizardPage2.java:157)
    at org.pentaho.di.ui.core.database.wizard.CreateDatabaseWizardPage2$3.widgetSelected(CreateDatabaseWizardPage2.java:147)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
    at org.eclipse.jface.window.Window.open(Window.java:796)
    at org.pentaho.di.ui.core.database.wizard.CreateDatabaseWizard.createAndRunDatabaseWizard(CreateDatabaseWizard.java:111)
    at org.pentaho.di.ui.spoon.Spoon.createDatabaseWizard(Spoon.java:7595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.pentaho.ui.xul.impl.AbstractXulDomContainer.invoke(AbstractXulDomContainer.java:313)
    at org.pentaho.ui.xul.impl.AbstractXulComponent.invoke(AbstractXulComponent.java:157)
    at org.pentaho.ui.xul.impl.AbstractXulComponent.invoke(AbstractXulComponent.java:141)
    at org.pentaho.ui.xul.jface.tags.JfaceMenuitem.access$100(JfaceMenuitem.java:43)
    at org.pentaho.ui.xul.jface.tags.JfaceMenuitem$1.run(JfaceMenuitem.java:106)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:545)
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:490)
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:402)
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at org.pentaho.di.ui.spoon.Spoon.readAndDispatch(Spoon.java:1319)
    at org.pentaho.di.ui.spoon.Spoon.waitForDispose(Spoon.java:7939)
    at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:9190)
    at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:654)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92)
Caused by: org.pentaho.di.core.exception.KettleDatabaseException: 
Error connecting to database: (using class net.sourceforge.jtds.jdbc.Driver)
I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.

    at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:592)
    at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:4697)
    at org.pentaho.di.core.database.Database.normalConnect(Database.java:414)
    ... 43 more
Caused by: java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:615)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:345)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at org.pentaho.di.core.database.Database.connectUsingClass(Database.java:578)
    ... 45 more
Caused by: java.io.IOException: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
    at net.sourceforge.jtds.jdbc.TdsCore.sendMSLoginPkt(TdsCore.java:1893)
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:588)

【问题讨论】:

【参考方案1】:

我通过将旧 Pentaho 安装中的 ntlmauth.dll 文件复制到 c:\Pentaho\libswt\win32 来解决此问题。

我从这篇文章中得到了提示:I/O Error: SSO Failed: Native SSPI library not loaded

总之,这个 dll 与集成身份验证有关,即使用您的 Windows ID 登录 SQL 服务器,而不是明确告诉驱动程序您的 ID 和密码。

老实说,我不明白为什么旧的安装有这个文件,而新的没有,但它有效。

其他替代方法可能是从 Microsoft 的官方 jdbc 驱动程序(尽管我不确定该 dll 是否只能与 Microsoft 的 JDBC 或 Pentaho 的驱动程序一起使用)或从 JTDS 包 (http://sourceforge.net/projects/jtds/) 获取相同的文件

【讨论】:

我使用 JTDS 没有问题。当我开始使用 5.4 时,我遇到了类似的问题。不确定这是否是“原因”,但我知道 PDI 已经放弃了对 SQL Server 作为数据库存储库主机的官方支持。我知道我不能让它工作。好在 Postgres 是免费的。 你有更新日志的链接吗?我很想知道为什么。我找不到它。这很奇怪,因为 PDI 5.4 仍然为我提供了连接到 SQL Server 的选项,并且仍然带有与 SQL Server 一起使用的 JDBC 驱动程序——显然只有集成身份验证给我带来了问题。 PS 这种未记录或记录不充分的更改(尤其是破坏向后兼容性的更改)是开源和免费软件的主要瘟疫之一,阻碍了它们在时间就是金钱的商业环境中的采用而你昨天需要一个答案...... 恐怕我没有在更改日志中看到它。它只是在某个地方,所以不要把它当作福音。然而,我确实尝试在 SQL Server 上建立一个 repo,但由于 SQL 方言问题而失败。我一直在使用集成身份验证时遇到问题。您必须将该 DLL 放在正确的位置。当我发现如何使用 JTDS 时,我转而使用它。【参考方案2】:

我在C:\PENTAHO\pdi-ce-7.0.0.0-25\data-integration\lib 中解决了应对驱动程序sqljdbc.jar 的问题。并复制文件sqljdbc_auth.dll 以允许另一种类型的身份验证。

最后,在连接类型上我选择了MS SQL SERVER(Native)

【讨论】:

【参考方案3】:

我解决了应对驱动程序 sqljdbc42。 jar 和 jtds-1.3

【讨论】:

以上是关于Pentaho 数据集成:与 MS SQL Server 的 jdbc 连接不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 Pentaho 连接到 MS SQL Server(本机)

Pentaho 与 REST 的数据集成

如何检查 cassandra 与 pentaho 数据集成器的连接

工程师手记 | 数据科学专题第三篇:Pentaho数据集成(PDI)与Python和模型管理

Pentaho 组件集成

Pentaho 数据集成输入/输出位类型错误