динамическая загрузка драйвера JDBC Teradata

0
05 авг 2015 07:05
Доброго времени суток.
Пишу небольшой класс для динамической загрузки драйверов JDBC в приложение.
import java.io.File;
import java.io.FileFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * класс отвечает за загрузку драйверов в систему
 * <p>
 * @author ezhov_da
 */
public class LoadDrivers
{
    private static final Logger LOG = Logger.getLogger(LoadDrivers.class.getName());
    private static File[] jars;
    private static AppConnection appConnection;
    private static Class pluginClass;
    private LoadDrivers()
    {
    }
    public static final synchronized void load(AppConnection appConnection)
    {
        LoadDrivers.appConnection = appConnection;
        readFolderDriver();
        loadClassLoader();
        createClasses();
    }
    /**
     * загружаем jar из папки
     */
    private static void readFolderDriver()
    {
        File pluginDir = new File(AppConnections.INSTANCE.getFolderDriver());
        jars = pluginDir.listFiles(new FileFilter()
        {
            public boolean accept(File file)
            {
                return file.isFile() && file.getName().endsWith(".jar");
            }
        });
    }
    /**
     * загружаем класс лоадеры
     */
    private static void loadClassLoader()
    {
        try
        {
            URL[] jarURL = new URL[jars.length];
            for (int i = 0; i < jars.length; i++)
            {
                jarURL[i] = jars[i].toURI().toURL();
            }
            URLClassLoader classLoader = new URLClassLoader(jarURL, LoadDrivers.class.getClassLoader());
            pluginClass = Class.forName(appConnection.getClassForName(), true, classLoader);
        } catch (Exception ex)
        {
            LOG.log(Level.SEVERE, null, ex);
        }
    }
    private static void createClasses()
    {
        try
        {
            Driver driver = (Driver) pluginClass.newInstance();
            //для теста
            Connection connection = driver.connect(appConnection.getUrl(), appConnection.getProperties());
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

из файла настроек:
<root>
  <folderDriver>drivers</folderDriver>
  <listConnection>
    <connection>
      <nameConnection>teradata</nameConnection>
	  <nameJarFile>terajdbc4</nameJarFile>
      <url>jdbc:teradata://...</url>
      <classForName>com.teradata.jdbc.TeraDriver</classForName>
      <properties>
        <property name="CHARSET" value="UTF-8"/>
        <property name="DATABASE" value="test"/>
        <property name="USER" value="user"/>
        <property name="PASSWORD" value="1"/>
      </properties>
    </connection>
    <connection>
      <nameConnection>mssql</nameConnection>
	  <nameJarFile>sqljdbc4</nameJarFile>	  
      <url>jdbc:...</url>
      <classForName>com.microsoft.sqlserver.jdbc.SQLServerDriver</classForName>
      <properties>
        <property name="USER" value="user"/>
        <property name="PASSWORD" value="1"/>
      </properties>
    </connection>	
    <connection>
      <nameConnection>oracle</nameConnection>
	  <nameJarFile>ojdbc14</nameJarFile>	  
      <url>jdbc:...</url>
      <classForName>oracle.jdbc.driver.OracleDriver</classForName>
      <properties>
        <property name="user" value="user"/>
        <property name="password" value="1"/>
      </properties>
    </connection>		
  </listConnection>
</root>



Драйверы для oracle и ms sql загружаются без проблем, но терадата выдает exception
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 14.10.00.34] [Error 1032] [SQLState HY000] Single Sign-On NOT supported for Mechanism TD2.
	at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:93)
	at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:68)
	at com.teradata.jdbc.jdbc.GenericTeraEncrypt.initEncrypt(GenericTeraEncrypt.java:229)
	at com.teradata.jdbc.jdbc.GenericTeraEncrypt.<init>(GenericTeraEncrypt.java:143)
	at com.teradata.jdbc.jdbc.GenericLogonController.run(GenericLogonController.java:240)
	at com.teradata.jdbc.jdbc_4.TDSession.<init>(TDSession.java:219)
	at com.teradata.jdbc.jdk6.JDK6_SQL_Connection.<init>(JDK6_SQL_Connection.java:35)
	at com.teradata.jdbc.jdk6.JDK6ConnectionFactory.constructSQLConnection(JDK6ConnectionFactory.java:25)
	at com.teradata.jdbc.jdbc.ConnectionFactory.createConnection(ConnectionFactory.java:179)
	at com.teradata.jdbc.jdbc.ConnectionFactory.createConnection(ConnectionFactory.java:169)
	at com.teradata.jdbc.TeraDriver.doConnect(TeraDriver.java:232)
	at com.teradata.jdbc.TeraDriver.connect(TeraDriver.java:158)
	at ru.ezhov.reviewlogs.connection.LoadDrivers.createClasses(LoadDrivers.java:80)
	at ru.ezhov.reviewlogs.connection.LoadDrivers.load(LoadDrivers.java:32)
	at ru.ezhov.test.TestLoadDriver.main(TestLoadDriver.java:15)


Подозреваю, что это из-за необходимости подгружать помимо jar - terajdbc4.jar еще и tdgssconfig.jar.
В методе readFolderDriver подгружаю все 3 jar ( + 1 tdgssconfig.jar).
В методе loadClassLoader загружаю их в один classLoader.
Создаю подключение и вылетает exception только при подключении к teradata.

Подскажите пож-ста, что я делаю не так и почему драйвер не видит своего файла настройки в одном и том же loader - e?

Заранее благодарю.

Ответов: 1

0
10 авг 2015 06:22
Нашел решение проблемы.
Вся проблема заключалась в строках:
 Driver driver = (Driver) pluginClass.newInstance();
Connection connection = driver.connect(appConnection.getUrl(), appConnection.getProperties());

А именно, JDBC taradata не хотел подключаться с настройками переданными через Properties.
Помогло использование свойств в url и передача пустого Properties вторым параметром.
Модераторы: Нет
Сейчас эту тему просматривают: Нет