2017-02-05 3 views
1

Я пытаюсь настроить источник данных JNDI на WebSphere 8.5.5.11 с помощью hive-jdbc.jar. При использовании консоли в WebSphere и использовании формы для создания нового поставщика JDBC существует поле для имени класса реализации. WebSphere требует, чтобы класс реализовал javax.sql.XADataSource или javax.sql.ConnectionPoolDataSource. Тем не менее, драйвер hive-jdbc реализует non of the, он реализует только java.sql.DataSource. По этой причине он не работает, WebSphere сообщает об ошибке при попытке сохранить форму.Определить источник данных JNDI hive-jdbc на WebSphere

enter image description here

Любая идея, что я могу сделать по этому поводу?

ответ

2

Вы можете написать тривиальную реализацию 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 вместе с JAR драйвера JDBC (ов), а также настроить свой собственный провайдер JDBC в WebSphere Application Server, чтобы указать на этот JAR, как если бы она была частью драйвер JDBC. Укажите имя класса реализации как example.datasource.HiveConnectionPoolDataSource или любой другой пакет/имя, которое вы выбрали для своей собственной реализации. Затем вы сможете использовать драйвер JDBC.

Также добавляется ссылка на WebSphere Application Server request for enhancements page, если кто-то хочет запросить поддержку поддержки javax.sql.DataSource.

+0

Добавление к ответу @ njr: традиционный WebSphere не позволяет создавать java.sql.DataSource. Он допускает только варианты ConnectionPool или XA. –

Смежные вопросы