我有一个项目名称下拉列表,并根据所选值生成架构下拉列表。
生成模式列表后,有一个“选择文件”选项,其中选择了一个脚本名称,该名称将在多个模式上运行。
项目列表值和架构列表值都存储在数据库中。数据库中还有另一个存储架构凭据的表。
我想知道如何在这些多个模式上创建连接,以及如何在从该模式下拉列表中选择的多个模式中运行脚本。
我使用scriptrunner
方法使用iBatis框架在一个模式中执行了代码。
表1:ProjectName
PROJECT_PK,
PROJECT_CODE,
PROJECT_NAME
表2:ComponentName
COMPONENT_PK,
COMPONENT_CODE,
COMPONENT_NAME,
PROJECT_PK
表3:SchemaName
(此表包含其他架构的凭据)
SCHEMA_PK,
SCHEMA_NAME,
PASSWORD,
ORACLE_SID,
HOST_NAME,
PORT_ID
表4:PROJECT_DETAIL
PROJECT_DETAIL_PK,
COMPONENT_PK,
SCHEMA_PK
表5:COMPONENT_DETAILS
COMPONENT_DETAILS_PK,
PROJECT_PK,
SCHEMA_PK
我正在附加方案图片。
答案 0 :(得分:0)
我建议您在每个其他模式上创建一个“超级模式”,并为这个“超级模式”创建JDBC连接。这将使您需要对sql脚本进行一些篡改 - 您需要使用一些标记来编写它以轻松替换模式,例如
ALTER TABLE ${SCHEMA_MARKER}.INVOICES ADD CLIENT_ADRRESS Varchar2(35);
您的Java代码会将其替换为您定位的架构。通过一些想象,您可以扩展这个想法,在所有模式上执行批量DDL脚本。
顺便说一句,我通过你的问题理解你有很多具有相同结构的模式。我曾经被迫使用这样一个遗留结构,所以我知道公司结构有很多动力;尽管如此,我必须建议你重新设计这样的系统。例如,考虑在超级模式上创建物化视图,复制模式结构,但在每个表主键中都有一个新字段(这个新字段将填补使得任何人在许多模式中为启动者分离数据的空白)。
这肯定会使您的查询缓存受到更少的影响,并且可以更轻松地开发需要使用“分布式”数据的任何新软件。
答案 1 :(得分:0)
在Oracle中,架构基本上是用户。因此,要在架构FOO
中创建表SX
,只需以用户SX
身份登录并执行create table FOO (...)
(不指定架构)。 Oracle中的user == schema约定将确保这一点。
要以SX
用户身份登录,请抓住您的DataSource
并使用getConnection(String username, String password)
代替默认getConnection()
替代方法是在您处理的脚本中添加占位符,以便首先生成有效的SQL。请参阅Jorge_B的答案。
最后,您可以使用ALTER SESSION
更改默认架构(请参阅Default Schema in Oracle Connection URL)。这种方法的问题在于,当使用带有DataSource
的Web容器时,必须在关闭连接之前恢复架构 - 在这种情况下,连接永远不会真正关闭,所以下一篇文章要求连接的代码将获得具有意外默认架构的代码 - >很难找到错误。
答案 2 :(得分:0)
以下是在运行时在同一数据库上创建多个架构连接的DAO类。
我们需要在运行时输入模式名称,并在某个servlet中调用它。
架构详细信息,即用户名,密码,主机ID,端口ID和SID将存储在数据库表中,通过这些表创建连接。
创建的连接存储在列表中,可以在以后使用。
此处的凭证DTO是映射到数据库中的数据库表然后
的对象Connection conn=DBUtil.getConnection(constants.DB_DS_NAME);
Statement stmt=null;
stmt=conn.createStatement();
ResultSet rs= null;
Connection [] con=new Connection[schemaname.length];
int i,j;
String [] url=new String[schemaname.length];
String [] username=new String[schemaname.length];
String [] password=new String[schemaname.length];
List<CredentialDTO> creDTOlist=new ArrayList<CredentialDTO>();
String query1="insert into dba_project_master VALUES(9,'abc','abc','abc','abc',40)";
String query2="CREATE TABLE EMP(EMPNO NUMBER(4,0) NOT NULL ENABLE,ENAME VARCHAR2(10 BYTE),JOB VARCHAR2(9 BYTE), SAL NUMBER(7,2),DEPTNO NUMBER(2,0))";
try
{
for(i=0;i<schemaname.length;i++){
String query=" select * from dba_schema_details where schema_name="+DBUtil.enquoteString(schemaname[i]);
rs=stmt.executeQuery(query);
while(rs.next()){
CredentialDTO creDTO=new CredentialDTO();
creDTO.setSCHEMA_PK(rs.getString("SCHEMA_PK"));
creDTO.setSCHEMA_NAME(rs.getString("SCHEMA_NAME"));
creDTO.setPASSWORD(rs.getString("PASSWORD"));
creDTO.setORACLE_SID(rs.getString("ORACLE_SID"));
creDTO.setHOST_NAME(rs.getString("HOST_NAME"));
creDTO.setPORT_ID(rs.getString("PORT_ID"));
creDTOlist.add(creDTO);
}
}
System.out.println("creDTOlist size:"+creDTOlist.size());
//create URL for the schema name
int m=creDTOlist.size();
Iterator<CredentialDTO> LItr= creDTOlist.iterator();
String [] username1=new String[m];
String [] password1=new String[m];
i=0;
while(LItr.hasNext()){
System.out.println("iteration "+i);
CredentialDTO temp = LItr.next();
String URL="jdbc:oracle:thin:@"+temp.getHOST_NAME()+":"+temp.getPORT_ID()+":"+temp.getORACLE_SID();
System.out.println("URL:"+URL);
username1[i]=temp.getSCHEMA_NAME();
System.out.println("iteartion "+i+" username="+username1[i]);
password1[i]=temp.getPASSWORD();
System.out.println("iteartion "+i+" password="+password1[i]);
Class.forName("oracle.jdbc.OracleDriver");
con[i]=DriverManager.getConnection(URL, username1[i], password1[i]);
System.out.println("Connection Name:" +con[i]);
Statement st1=con[i].createStatement();
con[i].setAutoCommit(false);
st1.addBatch(query1);
st1.addBatch(query2);
int [] update=st1.executeBatch();
i++;
}
}
catch(Exception ex){
ex.printStackTrace();
}finally
{
if (conn != null) try{conn.close();} catch(SQLException ignore) {}
if (stmt!= null) try{stmt.close();} catch(SQLException ignore) {}
if (rs != null) try{rs.close();} catch(SQLException ignore) {}
}
return creDTOlist;
}
}