java - Oracle数据库: access multiple database schemas

标签 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. “schema”可以是不同的数据库,因此不能选择为架构名称添加前缀;

所以我认为用过程/函数很难做到。使用Java实现访问不同的数据库可能是一个不错的选择?

请高手给点建议,如何设计?

最佳答案

我不太清楚sql语句(存储在MainSchema表中)的意思。如果您确实指的是具有保存 SQL 文本的字符串列的表,那么这确实是一件奇怪的事情。

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

操作两个模式实际上很简单:您需要为表(和其他对象)添加模式名称前缀。你可以做类似的事情

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 没有考虑任何特定的数据库,那么您当然可以只连接到数据库并保持 SQL 不变。但是,您将无法使用insert-select。您需要两个数据库连接,一个用于执行选择,另一个用于执行插入。

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

关于java - Oracle数据库: access multiple database schemas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25856520/

相关文章:

database - 删除数据库用户是否会触发用户在其他模式的表上引发?

java - Oracle Web 服务日期在 Java 代码中返回 Null,但在 SOAP UI 中不返回 Null

php - 我可以打开 mySql 连接,但不能打开特定数据库

java - 当一个线程到达目的地时,其他线程停止

java - 顺时针旋转链表

java - 使用单独的线程更新全局 HashMap 时出现空指针异常

java - jdbc kerberos oracle认证问题

sql-server - 在 SSIS 包中存储密码

java - SQLException : 'No suitable driver found' when PowerMockito mockStatic DriverManager. 类

java - 有 3 个参数但接受一个参数的方法?