我有几个Oracle数据库模式: 例如MainSchema和其他数据模式,如dataSchema1,dataSchema2,dataSchema3
我的要求是在其中一个数据模式中执行sql语句(存储在MainSchema表中),并将结果写入MainSchema结果表。
我能想到的是: 使用在MainSchema中发布的Java存储过程连接到数据模式(我知道要为sql语句连接哪个模式)并执行sql,然后将结果写入MainSchema结果表。
我想知道:
这是一个很好的方法吗?或任何替代是最佳做法?
这是多线程环境,意味着连接数 可能会快速增长我如何处理连接池?
编辑: 以下假设:
所以我认为程序/功能很难做到。使用Java实现访问不同的数据库可能是一个不错的选择?
这里的专家请给出一些如何设计的建议?
答案 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