Oracle数据库:访问多个数据库模式

时间:2014-09-15 20:38:48

标签: java oracle database-connection

我有几个Oracle数据库模式: 例如MainSchema和其他数据模式,如dataSchema1,dataSchema2,dataSchema3

我的要求是在其中一个数据模式中执行sql语句(存储在MainSchema表中),并将结果写入MainSchema结果表。

我能想到的是: 使用在MainSchema中发布的Java存储过程连接到数据模式(我知道要为sql语句连接哪个模式)并执行sql,然后将结果写入MainSchema结果表。

我想知道:

  • 这是一个很好的方法吗?或任何替代是最佳做法?

  • 这是多线程环境,意味着连接数 可能会快速增长我如何处理连接池?

编辑: 以下假设:

  1. sql语句存储在MainSchemas中的clob列中;
  2. sql语句只是SELECT查询(只读)并且已经过验证;
  3. sql语句不需要任何连接信息(意思是本地编写)
  4. "模式"可以是不同的数据库,因此前缀模式名称不是一个选项;
  5. 所以我认为程序/功能很难做到。使用Java实现访问不同的数据库可能是一个不错的选择?

    这里的专家请给出一些如何设计的建议?

2 个答案:

答案 0 :(得分:1)

我不太清楚 sql语句(存储在MainSchema表中)的含义。如果你真的是指带有SQL文本的字符串列的表,那么这真的是一件奇怪的事情。

更好的方法是创建一堆返回游标的存储过程。然后,您将调用其中一个过程并从游标中获取并回写到MainSchema的结果表。这种方法的好处是在编译期间检查SQL,而字符串中的SQL(无论你在哪里存储它)都是容易出错的事情。

在两个模式上操作实际上很简单:您需要使用schama名称为表(和其他对象)添加前缀。你可以做像

这样的事情
insert into mainSchema.resultTable (
select ... from dataSchema1.dataTable1
where ...
)

如果你能写出这样的东西,那么......好吧..你只需要运行它。如果必须,您也可以从Java执行此操作。

但是,如果模式名称是变量,即您的SQL不是特定于模式,但您决定在运行时使用哪个dataSchema,那么这不起作用。然后再次拥有包含类似数据的多个模式几乎总是一个坏主意。你需要按意义划分,而不是按原点或时间段等物理划分。这里一个好的解决方案是使用分区表。

修改

如果您只是担心连接数,可能需要设置Oracle以使用shared connections。但是,这需要控制您可能没有的数据库。

连接池是应用程序服务器的典型工作。但是,这对于运行某些选择来说是相当大的开销,如果你不是完全无国籍的话,它有时会产生意想不到的后果。

如果需要连接到不同的数据库,那么数据库链接是标准的方法。您不需要使用模式名称为对象添加前缀,而是需要添加数据库链接的名称,如

insert into mainSchema.resultTable (
select ... from dataTable1@linkName
where ...
)

如果您的SQL编写时没有考虑任何特定的DB,那么您当然可以连接到数据库并保留SQL原样。但是,您将无法使用insert-select。您需要两个DB连接,一个用于执行select,另一个用于执行插入。

我相信您的方法会奏效,但我不明白为什么将SQL存储在数据库而不是应用程序代码中。如果它在应用程序代码中,您只需组装SQL,在需要的地方添加@linkName,您可以使用insert-select,并且可以从命令行运行这样的insert-select进行测试,而无需进行任何编译。

答案 1 :(得分:0)

对我来说,Java存储过程是一种方法。

http://docs.oracle.com/cd/B19306_01/java.102/b14187/chfive.htm