1

我在远程机器上有两个数据库,我想在CMTon中使用它们TomEE 7.0.2。我在其中配置了两个 XA 数据源,tomee.xml但遇到了登录问题。应用程序服务器遇到错误时无法创建数据源。在 xml 中正确设置了用户名和密码。我创建了一个测试来检查它是否ojdbc7.jar做了一些讨厌的事情,但它能够正常登录。

问题

我也调试TomEE了检查包wireshark。问题似乎在里面TomEE。发送到 oracle 机器的请求包含以下内容:

(DESCRIPTION=(CONNECT_DATA=(SID=DBNAME)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=osuser)))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521)))

如您所见,此连接数据尝试使用osuser而不是tomee.xml.

我也尝试了基于http://tomee.apache.org/datasource-config.html的不同配置。

问题

如何配置TomEE为使用提供的用户和密码进行数据库连接?

应用:

tomee.xml:

默认PasswordCipherPlainText包含它以确保它。

<?xml version="1.0" encoding="UTF-8"?>
<tomee>
    <Resource id="oracleDS" type="DataSource">
      XaDataSource oracleXADS
      DataSourceCreator dbcp-alternative
    </Resource>

    <Resource id="oracleXADS" type="XADataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
      Url jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
      Username user
      PasswordCipher PlainText
      Password pass
    </Resource>

    <Resource id="postgreDS" type="DataSource">
      XaDataSource postgreXADS
      DataSourceCreator dbcp-alternative
    </Resource>

    <Resource id="postgreXADS" type="XADataSource" class-name="org.postgresql.xa.PGXADataSource">
      Url jdbc:postgresql://192.168.1.10:5432/DBNAME
      Username user
      PasswordCipher PlainText
      Password pass
    </Resource>

</tomee>

还尝试了这种格式:

<Resource id="oracleXADS" type="javax.sql.XADataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">   
  url = jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
  userName = user
  passwordCipher = PlainText
  password = pass
</Resource>

持久性.xml:

<persistence-unit name="oraDS" transaction-type="JTA">
    <jta-data-source>oracleXADS</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
<persistence-unit name="pgDS" transaction-type="JTA">
    <jta-data-source>postgreXADS</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>

测试文件相同ojdbc7.jar

TestDatasource.java 的相关部分

Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("Oracle JDBC Driver Registered!");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.10:1521:DBNAME", "user", "pass");
//connection is checked and it is OK

相关TestXADatasource.java

OracleXADataSource oxds = new OracleXADataSource();
oxds.setURL("jdbc:oracle:thin:@192.168.1.10:1521:DBNAME");
oxds.setUser("user");
oxds.setPassword("pass");

XAConnection pc  = oxds.getXAConnection();
Connection conn1 = pc.getConnection();
//connection is checked and it is OK

其他不起作用的解决方案:

我检查了以下内容,但这些不是我的问题的解决方案:

factoryA)根据接受的答案,我没有导致问题的财产。

B)我使用最新的 Oracle 驱动程序,数据库也是 12,尽管我创建了下面提供的简单测试。

A) 我在两台机器上都使用 linux,并且在不同的应用服务器上使用Java.

4

3 回答 3

0

这里有几点需要说明:

操作系统用户部分

驱动程序发送此信息不是作为身份验证过程的一部分,而是作为开始登录的环境。这意味着登录值在不同的请求中发送。如果您TCP使用密码和用户来关注流CANARY,您可以检查它是否包含在请求中的任何形式中。提到的配置将包含它。

真正的问题

真正的问题是http://tomee.apache.org/datasource-config.html是错误的。这userName不是用户名的有效声明。有效的声明如下:

<Resource id="oracleDS" type="DataSource">
  XaDataSource oracleXADS
  DataSourceCreator dbcp-alternative
</Resource>

<Resource id="oracleXADS" type="javax.sql.DataSource" class-name="oracle.jdbc.xa.client.OracleXADataSource">
  url jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
  user user
  passwordCipher PlainText
  password password
</Resource>

TL.DR.:文档是错误的。在对发布的配置进行唯一更改userName->userTCP后,流包含必要的用户名并且登录成功。(该问题通知 ApacheTomEE邮件列表。)

在此处输入图像描述

于 2017-09-01T12:49:11.023 回答
0

您可以忽略连接字符串中的用户名。它不是用于身份验证的。

我认为您的数据源配置不正确。根据 TomEE 配置文档 [1],它应该如下所示:

<Resource id="oracleDS" type="DataSource">
    JdbcDriver  oracle.jdbc.OracleDriver
    JdbcUrl jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
    UserName    user
    Password    pass
</Resource>

<Resource id="oracleXADS" type="DataSource">
    JdbcDriver oracle.jdbc.xa.client.OracleXADataSource
    JdbcUrl jdbc:oracle:thin:@192.168.1.10:1521:DBNAME
    UserName    user
    Password    pass
</Resource>

[1] http://tomee.apache.org/common-datasource-configurations.html

于 2017-08-30T16:04:22.167 回答
0

为了澄清正在发生的事情以及文档看起来错误的原因:

  • 使用 class-name 你配置你提到的类。Tomee 不知道,但在 tomee.sh 中提供了一个 setters 辅助命令
  • 使用类型 DataSource 你要求一个数据源池,这里 userName 是有效的,池使用的用户名。根据 xadatasource impl,它被忽略或不支持 xa 用户配置(也可以有另一个名称)

换句话说,oracleXADS 不是 tomee 数据源,而是支持 DataSource 注入的用户资源

该文档仅关于 tomee pooling

于 2017-09-06T18:40:48.440 回答