PDI SDK:在输入步骤中重用SQL连接

时间:2014-09-21 21:09:10

标签: pentaho kettle

我需要使用Java代码中的PDI SDK动态生成转换。转换输入是SQL select,输出是文本文件。

下面的代码正确连接到输入步骤的数据库(TableInputMeta):

String dbXML =  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
          "<connection>" +
              "<name>source</name>" +
              "<server>localhost</server>" +
              "<type>MYSQL</type>" +
              "<access>Native</access>" +
              "<database>db</database>" +
              "<port>3306</port>" +
              "<username>user</username>" +
              "<password>pwdk</password>" +
            "</connection>";

DatabaseMeta dbm = new DatabaseMeta(dbXML);
TableInputMeta in = new TableInputMeta();
in.setDatabaseMeta(dbm);

但我不想存储用户和密码。此外,我在已经拥有数据库连接池的应用程序服务器中运行此代码。这就是我想要实现的目标:

// get connection from JNDI
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup(jndiName);
java.sql.Connection conn = ds.getConnection();


// reuse connection
DatabaseMeta dbm = new DatabaseMeta();
dbm.setConnection(conn);  // this has not been implemented

其中setConnection(conn)将现有连接与DatabaseMeta对象链接。有什么想法吗?

更新

我在Spoon中创建了一个JNDI连接,这是XML,但我无法弄清楚如何调整它以使其工作:

<?xml version="1.0" encoding="UTF-8"?>
  <connection>
    <name>JNDI_CONNECT</name>
    <server/>
    <type>MYSQL</type>
    <access>JNDI</access>
    <database>JNDI_NAME</database>
    <port>1521</port>
    <username/>
    <password>Encrypted </password>
    <servername/>
    <data_tablespace>TAB_DATA</data_tablespace>
    <index_tablespace>TAB_IND</index_tablespace>
    <attributes>
      <attribute><code>FORCE_IDENTIFIERS_TO_LOWERCASE</code><attribute>N</attribute></attribute>
      <attribute><code>FORCE_IDENTIFIERS_TO_UPPERCASE</code><attribute>N</attribute></attribute>
      <attribute><code>IS_CLUSTERED</code><attribute>N</attribute></attribute>
      <attribute><code>PORT_NUMBER</code><attribute>1521</attribute></attribute>
      <attribute><code>QUOTE_ALL_FIELDS</code><attribute>N</attribute></attribute>
      <attribute><code>STREAM_RESULTS</code><attribute>Y</attribute></attribute>
      <attribute><code>SUPPORTS_BOOLEAN_DATA_TYPE</code><attribute>N</attribute></attribute>
      <attribute><code>USE_POOLING</code><attribute>N</attribute></attribute>
   </attributes>
</connection>

这是我用Java连接到JNDI的方式:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/mydb");
Connection cn = ds.getConnection();

非常感谢任何见解/工作示例。

1 个答案:

答案 0 :(得分:0)

上面的示例XML将访问类型设置为“Native”,它将使用指定的参数。如果您想使用JNDI,则应将访问类型设置为JNDI。要获得XML的工作片段,请尝试在Spoon中创建相同的连接以进行一些示例转换,将转换保存到磁盘,然后检查.ktr文件以查找具有该名称的连接。您应该找到一个可用的XML片段,它将使DatabaseMeta使用JNDI而不是提供的参数。