限定在WebSphere蜂房-JDBC JNDI数据源(Define hive-jdbc JNDI

2019-09-28 04:22发布

我想建立一个JNDI数据源在WebSphere 8.5.5.11,使用蜂房了jdbc.jar。 当在WebSphere使用控制台,并使用窗体创建新的JDBC提供,有一个实现类名称的字段。 的WebSphere要求类实现javax.sql.XADataSourcejavax.sql.ConnectionPoolDataSource 。 然而,蜂巢-JDBC驱动程序实现的那些非,但仅实现java.sql.DataSource 。 出于这个原因,它不工作时,WebSphere报告试图保存表单时出错。

任何想法,我能做些什么呢?

Answer 1:

你可以写一个简单的实现的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(S),并配置在WebSphere Application Server自定义JDBC提供这个JAR点,就好像是JDBC驱动程序的一部分。 指定实现类的名称example.datasource.HiveConnectionPoolDataSource或者你选择了自己的实现无论包/名称。 然后,您应该能够使用JDBC驱动程序。

还加入了链接到WebSphere Application Server的请求,增强页面如果有人想请求添加为javax.sql.DataSource中的支持。



文章来源: Define hive-jdbc JNDI data source on WebSphere