在websphere上定义配置单元jdbc jndi数据源

91zkwejq  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(451)

我正在尝试使用hive-jdbc.jar在WebSphere8.5.5.11上设置jndi数据源。在websphere中使用控制台并使用窗体创建新的jdbc提供程序时,有一个用于实现类名的字段。websphere要求类实现 javax.sql.XADataSource 或者 javax.sql.ConnectionPoolDataSource . 但是,hivejdbc驱动程序实现的不是这些,它只实现这些 java.sql.DataSource . 因此,它无法工作,websphere在尝试保存表单时会报告一个错误。

你知道我该怎么办吗?

qybjjes1

qybjjes11#

您可以编写 javax.sql.ConnectionPoolDataSource 代表 javax.sql.DataSource 实施。举个例子,

package example.datasource;

import java.sql.*;
import javax.sql.*;

public class HiveConnectionPoolDataSource extends org.apache.hive.jdbc.HiveDataSource implements ConnectionPoolDataSource {
    public PooledConnection getPooledConnection() throws SQLException {
        return new HivePooledConnection(null, null);
    }

    public PooledConnection getPooledConnection(String user, String password) throws SQLException {
        return new HivePooledConnection(user, password);
    }

    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return ConnectionPoolDataSource.class.equals(iface) || super.isWrapperFor(iface);
    }

    public <T> T unwrap(Class<T> iface) throws SQLException {
        return ConnectionPoolDataSource.class.equals(iface) ? (T) this : super.unwrap(iface);
    }

    class HivePooledConnection implements PooledConnection {
        private Connection con;
        private final String user;
        private final String password;

        HivePooledConnection(String user, String password) {
            this.user = user;
            this.password = password;
        }

        public void addConnectionEventListener(ConnectionEventListener listener) {}

        public void addStatementEventListener(StatementEventListener listener) {}

        public void close() throws SQLException {
            if (con != null) {
                con.close();
                con = null;
            }
        }

        public Connection getConnection() throws SQLException {
            if (con == null || con.isClosed()) {
                con = user == null
                        ? HiveConnectionPoolDataSource.this.getConnection()
                        : HiveConnectionPoolDataSource.this.getConnection(user, password);
                return con;
            } else
                throw new IllegalStateException();
        }

        public void removeConnectionEventListener(ConnectionEventListener listener) {}

        public void removeStatementEventListener(StatementEventListener listener) {}
    }
}

将编译后的类打包到一个jar中,与jdbc驱动程序jar一起,并在websphereapplicationserver中配置自定义jdbc提供程序,使其指向这个jar,就像它是jdbc驱动程序的一部分一样。将实现类名指定为 example.datasource.HiveConnectionPoolDataSource 或者您为自己的实现选择的任何包/名称。然后您应该能够使用jdbc驱动程序。
如果有人想请求添加对javax.sql.datasource的支持,还可以添加到WebSphereApplicationServer请求增强页面的链接。

相关问题