【问题标题】:Getting a DataSouce from url and driver从 url 和驱动程序获取数据源
【发布时间】:2012-01-22 23:30:54
【问题描述】:

我需要初始化一个给定 url 和驱动程序的 DataSource。 它需要足够通用以支持 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 正在实现接口数据源,所以它很容易退出......但我不确定是否足够通用。

编辑

我想知道如果我在这些连接中有多个数据库连接和多个实例/模式,应该如何实现......

我当前的代码如下:

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 是一个包含 xml 属性的 java bean。

【问题讨论】:

  • 你到底在问什么? JBoss 负责给您一个 DataSource,只要您告诉它 JDBC 驱动程序类是什么。你不必关心任何事情。
  • 我连接了多个数据库,我需要获取一个给定数据库连接名称的数据源。使用该 xml 文件,该文件配置所有连接的数据库。
  • @JBNizet 我希望我能设法让我的问题更清楚

标签: java url jboss datasource driver


【解决方案1】:

这是一个通过 JNDI 名称获取数据源的通用代码 sn-p:

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

但是从您的 XML 文件中,我不确定 JNDI 名称是什么。它是什么 XML 方言?

【讨论】:

  • @Noam:那又怎样?这是在 JEE 应用程序中获取数据源的标准方法。 JEE 服务器负责根据其配置返回一个 DataSource。
  • @Noam:实际上是从 JBoss 的网站复制粘贴的。惊喜:这是正确的做法,所有体面的网站都以这种方式发布。
  • @KasperSørensen 不要被侮辱,这不是我要问的,你发布的代码不是我问题的解决方案......
  • @Noam:应用服务器很有用,因为它们为您处理连接池和数据源。您不应该基于专有的 XML 属性重新实现它。在 JBoss 中声明每个数据源,就像 JBoss 记录它一样,并使用 JNDI 根据您的租户获取适当的数据源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多