Получение DataSouce от URL и драйвера - PullRequest
0 голосов
/ 18 декабря 2011

Мне нужно инициализировать источник данных, заданный URL-адрес и драйвер.Он должен быть достаточно универсальным для поддержки Oracle и SQL Server.приложение работает на jboss 5.

предоставленный пример для обоих типов:

<db-connection name="TEST-ORACLE">
<url>jdbc:oracle:thin:@test:1521:ins1</url>
<driver>oracle.jdbc.xa.client.OracleXADataSource</driver>
<user>user</user>
<password>{ENCR}oRloKFKlqXs=</password>
<min-size>5</min-size>
<max-size>30</max-size>
<idle-timeout-minutes>1</idle-timeout-minutes>
</db-connection>

<db-connections>
    <db-connection name="TEST-MSSQLSERVER">
    <url>jdbc:jtds:sqlserver://server:1433/db;ProgramName=program;SelectMethod=cursor;useLOBs=false</url>
    <driver>net.sourceforge.jtds.jdbc.Driver</driver>
    <user>user</user>
    <password>{ENCR}oRloKFKlqXs=</password>
    <min-size>40</min-size>
    <max-size>80</max-size>
    <idle-timeout-minutes>1</idle-timeout-minutes>
</db-connection>

OracleXADataSource реализует источник данных inteface, поэтому его легко завершить ... но я не уверен, что он достаточно общий.

РЕДАКТИРОВАТЬ

Интересно, каким должен быть способ достижения этого, если у меня есть несколько подключений БД и несколько экземпляров / схем в этих подключениях .....

мой текущий код выглядит следующим образом:

private DataSource getDataSourceForTanent(TenantConfig i_Tenant) {
        DataSource result = null;
        ClassLoader loader = DBConnector.class.getClassLoader();
        try {
            Class driverClass = loader.loadClass(i_Tenant.getDriver());
            Object driver = driverClass.newInstance();
            if(driver instanceof OracleDataSource){
                ((OracleDataSource)driver).setURL(i_Tenant.getUrl());
                ((OracleDataSource)driver).setUser(i_Tenant.getUser());
                ((OracleDataSource)driver).setPassword(i_Tenant.getPassword());
                result = (DataSource) driver;
            } else if(driver instanceof Driver){
                Properties prop = new Properties();
                prop.put("user", i_Tenant.getUser());
                prop.put("password", i_Tenant.getPassword());
                prop.put("min-size", i_Tenant.getMinSize());
                prop.put("max-size", i_Tenant.getMaxSize());
                prop.put("idle-timeout-minutes", i_Tenant.getIdleTimeoutMinute());
                Connection con = ((Driver)driver).connect(i_Tenant.getUrl(), prop);
                if(con != null){
                    //TODO: SQLServer handling
                }
            }

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;
    }

TenantConfig - это Java-бин, содержащий свойства xml.

1 Ответ

1 голос
/ 18 декабря 2011

Вот фрагмент общего кода для получения источника данных по имени JNDI:

Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/mydatasource");

Но из вашего XML-файла я не уверен, как называется JNDI. Что это за диалект XML?

...