有限マルチインスタンス・モードを使用したデータベース構造情報の管理
11823 ワード
マルチインスタンスモードは、クラスが複数のインスタンスを持つことができるモードであり、単一のインスタンスモードの自然な普及である.その特徴は次のとおりです.
1、このクラスには複数のインスタンスがあり得る.
2、クラス自体が作成して管理するインスタンス;
3、クラス自体から外部にその実例を提供する.
JadePoolは、有限マルチインスタンス・モードを使用してデータベース構造情報を管理します.
JadePoolオープンソースツールでは、具体的には、DbCenterがトランザクション型データベースのデータベース構造情報を管理し、DbAccessが非トランザクション型データベースのデータベース構造情報を管理し、Db計画の方法を共に遵守します.それぞれのTable、Fieldオブジェクトを管理します.この記事では、DbCenterを例に、データベース構造情報管理の実装手順について簡単に説明します.
有限マルチインスタンス・モードを選択してデータベース構造情報を管理する理由
これは最も合理的な選択であり、データベース構造情報はソフトウェアシステム全体の共有リソースとして大量に使用される可能性があるため、このようなリソースはメモリに存在する必要があります.DbCenterは現在、4つのインスタンスを提供しています.各インスタンスは1つのデータベースの構造情報を管理し、ソフトウェアシステムは理論的に最大4つのデータベースを同時に管理することができます.通常、ユーザーは1つのインスタンスしか必要ありません.2つの異なるデータベースのインタラクティブな操作を実現する必要がある場合、ユーザーは2つのインスタンスをインスタンス化することができます.限られたマルチインスタンス・モードを使用すると、いくつかの異なるデータベースに対してユーザーが同時に操作できることが保証されます.
DbCenterはどんな仕事をしましたか?
1.ユーザー要求、例えばプロセスVO構築方法の要求に基づき、対応するDbCenterインスタンスを作成し、そのインスタンスを初期化し、そのインスタンスをユーザーに提出する.
2.インスタンス化されたクラスの属性.データベース・ドライブ名、データベース・フレーム名、データベース名、データベース・テーブル名の集合を含む.
3、データベースの各テーブルにTableオブジェクトを作成する;
4、各テーブルのフィールドにFieldオブジェクトを作成する.
以上の4ステップの作業により,データベース全体の構造情報を完全に抽出し,供給用プログラムを次のステップで呼び出す.
以下に、JadePool-1.0-GBKのリソースファイルをダウンロードして取得できるソースコードの一部を示します.
HashMapリレーションシップデータマッピング技術に基づくJadePoolの実装では,Dbファミリーは有限多例モードによりデータベース構造情報を動的に抽出し管理し,JadePoolの大執事である.これはHRM製品とORM製品の最も根本的な違いです.JadePoolが効率的、簡潔、インテリジェント化を実現するための重要な前提である.
ちなみにDbAccessは、非トランザクション・データベースを管理するデータベース構造情報の抽出を担当します.
DbCenterとDbAccessを使用する重要な違いは、データベースがトランザクションをサポートしているかどうかです.トランザクション型のデータベースでは、ResultSet rsk=dm.getPrimaryKeys(catalog,null,tableName)を使用できます.文は、トランザクションではなくプライマリ・キー情報を抽出します.この操作は、現在サポートされていません.現在、JadePoolは非トランザクション・データベースのテーブルの最初のフィールドをプライマリ・キーとして扱っています.
DbCenterのインスタンス化方法
ProcessVOはJadePoolのコアクラスであり、主にデータベースのCRUDまたはDML操作を実現するために使用される.現在、このクラスには3つの構造関数があります.
1、ProcessVO();DbCenterのdefaultDbインスタンスをインスタンス化します 2、ProcessVO(Connection con);DbCenterのuserDbインスタンスをインスタンス化します 3、ProcessVO(Connection con, int connectionType);これはconnectionTypeの値、例えばcn.jadepool.sql.DbConnectionType.USING_DB_01 db_をインスタンス化01,cn.jadepool.sql.DbConnectionType.USING_によるDB_02 db_をインスタンス化02.
例:
ProcessVO pvo=new ProcessVO();
Db db=pvo.getDb();
......
この場合、ユーザはdbを介してデータベースの構造情報、テーブルの構造情報、およびフィールドの構造情報にアクセスすることができる.
JadePoolに興味がある場合は、jadepool-1.0-GBKを以下のURLでダウンロードできます.
http://download.csdn.net/detail/wj800/5109413
http://www.jadepool.cn/down?id=1000
1、このクラスには複数のインスタンスがあり得る.
2、クラス自体が作成して管理するインスタンス;
3、クラス自体から外部にその実例を提供する.
JadePoolは、有限マルチインスタンス・モードを使用してデータベース構造情報を管理します.
JadePoolオープンソースツールでは、具体的には、DbCenterがトランザクション型データベースのデータベース構造情報を管理し、DbAccessが非トランザクション型データベースのデータベース構造情報を管理し、Db計画の方法を共に遵守します.それぞれのTable、Fieldオブジェクトを管理します.この記事では、DbCenterを例に、データベース構造情報管理の実装手順について簡単に説明します.
有限マルチインスタンス・モードを選択してデータベース構造情報を管理する理由
これは最も合理的な選択であり、データベース構造情報はソフトウェアシステム全体の共有リソースとして大量に使用される可能性があるため、このようなリソースはメモリに存在する必要があります.DbCenterは現在、4つのインスタンスを提供しています.各インスタンスは1つのデータベースの構造情報を管理し、ソフトウェアシステムは理論的に最大4つのデータベースを同時に管理することができます.通常、ユーザーは1つのインスタンスしか必要ありません.2つの異なるデータベースのインタラクティブな操作を実現する必要がある場合、ユーザーは2つのインスタンスをインスタンス化することができます.限られたマルチインスタンス・モードを使用すると、いくつかの異なるデータベースに対してユーザーが同時に操作できることが保証されます.
DbCenterはどんな仕事をしましたか?
1.ユーザー要求、例えばプロセスVO構築方法の要求に基づき、対応するDbCenterインスタンスを作成し、そのインスタンスを初期化し、そのインスタンスをユーザーに提出する.
2.インスタンス化されたクラスの属性.データベース・ドライブ名、データベース・フレーム名、データベース名、データベース・テーブル名の集合を含む.
3、データベースの各テーブルにTableオブジェクトを作成する;
4、各テーブルのフィールドにFieldオブジェクトを作成する.
以上の4ステップの作業により,データベース全体の構造情報を完全に抽出し,供給用プログラムを次のステップで呼び出す.
以下に、JadePool-1.0-GBKのリソースファイルをダウンロードして取得できるソースコードの一部を示します.
synchronized private void init(Connection _con) {
this.con = _con;
try {
//schema=con.getSchema();
catalog = con.getCatalog();//
dm = con.getMetaData();
driverName = dm.getDriverName();
Set<String> tableNameSet = new java.util.LinkedHashSet();//
String[] types = {"TABLE"};
ResultSet rs = dm.getTables(null, null, null, types);//
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");
tableNameSet.add(tableName);
}
Object[] o = tableNameSet.toArray();
tableNames_tmp = new String[o.length];
tableNames = new String[o.length];
for (int i = 0; i < o.length; i++) {
tableNames_tmp[i] = (String) o[i].toString();
tableNames[i] = (String) o[i].toString().toLowerCase();
}
if (tableNames_tmp != null) {
for (int i = 0; i < tableNames_tmp.length; i++) {
initTableMap(tableNames_tmp[i]);//
}
}
instance_times++;
} catch (SQLException ex) {
Logger.getLogger(DbCenter.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
} finally {
//con.close(); con, , Db .getCon()
}
}
/**
* , Field : ResultSet rs = dm.getColumns(catalog,
* null, tableName, null);/ derby , ,
*
* @param tableName , dm , , , , ,
*/
synchronized private void initTableMap(String tableName) throws SQLException {
Table table = getTable(tableName.toLowerCase());
if (table == null) {
table = new Table();
}
table.setName(tableName.toLowerCase());
Set fieldSet = new java.util.LinkedHashSet();
Set keySet = new java.util.LinkedHashSet();
if (con != null) {
ResultSet rs = dm.getColumns(catalog, null, tableName, null);// // ResultSet rs = dm.getProcedureColumns(catalog, catalog, driverName, tableName);//?
Map<String, Field> field_map = new LinkedHashMap();
while (rs.next()) {
String name = rs.getString("COLUMN_NAME");// dm.getColumns(catalog, null, tableName, null)
fieldSet.add(lowerCase(name));
Field f = new Field();
f.setName(lowerCase(name));
//DATA_TYPE int => SQL type from java.sql.Types
/*
Each column description has the following columns:
TABLE_CAT String => table catalog (may be null)
TABLE_SCHEM String => table schema (may be null)
TABLE_NAME String => table name
COLUMN_NAME String => column name
DATA_TYPE int => SQL type from java.sql.Types
TYPE_NAME String => Data source dependent type name, for a UDT the type name is fully qualified
COLUMN_SIZE int => column size.
BUFFER_LENGTH is not used.
DECIMAL_DIGITS int => the number of fractional digits. Null is returned for data types where DECIMAL_DIGITS is not applicable.
NUM_PREC_RADIX int => Radix (typically either 10 or 2)
NULLABLE int => is NULL allowed.
columnNoNulls - might not allow NULL values
columnNullable - definitely allows NULL values
columnNullableUnknown - nullability unknown
REMARKS String => comment describing column (may be null)
COLUMN_DEF String => default value for the column, which should be interpreted as a string when the value is enclosed in single quotes (may be null)
SQL_DATA_TYPE int => unused
SQL_DATETIME_SUB int => unused
CHAR_OCTET_LENGTH int => for char types the maximum number of bytes in the column
ORDINAL_POSITION int => index of column in table (starting at 1)
IS_NULLABLE String => ISO rules are used to determine the nullability for a column.
YES --- if the column can include NULLs
NO --- if the column cannot include NULLs
empty string --- if the nullability for the column is unknown
SCOPE_CATALOG String => catalog of table that is the scope of a reference attribute (null if DATA_TYPE isn't REF)
SCOPE_SCHEMA String => schema of table that is the scope of a reference attribute (null if the DATA_TYPE isn't REF)
SCOPE_TABLE String => table name that this the scope of a reference attribute (null if the DATA_TYPE isn't REF)
SOURCE_DATA_TYPE short => source type of a distinct type or user-generated Ref type, SQL type from java.sql.Types (null if DATA_TYPE isn't DISTINCT or user-generated REF)
IS_AUTOINCREMENT String => Indicates whether this column is auto incremented
YES --- if the column is auto incremented
NO --- if the column is not auto incremented
empty string --- if it cannot be determined whether the column is auto incremented
IS_GENERATEDCOLUMN String => Indicates whether this is a generated column
YES --- if this a generated column
NO --- if this not a generated column
empty string --- if it cannot be determined whether this is a generated column
*/
String dataType = rs.getString("DATA_TYPE");
f.setSqlType(new Integer(dataType).intValue());// :java.sql.Types.INTEGER
String type = rs.getString("TYPE_NAME");// :BIGINT
f.setTypeName(lowerCase(type));
String position = rs.getString("ORDINAL_POSITION");//
f.setPosition(position);
String size = rs.getString("COLUMN_SIZE");//
f.setSize(size);
String bufferLength = rs.getString("BUFFER_LENGTH");//
f.setBufferLength(bufferLength);
String decimal = rs.getString("DECIMAL_DIGITS");//
f.setDecimal(decimal);
String defaultValue = rs.getString("COLUMN_DEF");
f.setDefaultValue(defaultValue);
String remark = rs.getString("REMARKS");
f.setRemark(remark);
String nullable = rs.getString("NULLABLE");// 0||1,1 ,0
if ("0".equals(nullable)) {
f.setNullable(false);
}
if ("1".equals(nullable)) {
f.setNullable(true);
}
field_map.put(name.toLowerCase(), f);
}
table.setFieldMap(field_map);// :Field ;
//
Object[] o = fieldSet.toArray();
String[] fields = new String[o.length];
for (int i = 0; i < o.length; i++) {
fields[i] = ((String) o[i]).toLowerCase();
}
table.setFields(fields);
// ,
ResultSet rsk = dm.getPrimaryKeys(catalog, null, tableName); // SQL Server MySQL jdbc , //ResultSet rsk = dm.getPrimaryKeys(catalog, "%", tableName);// MySQL jdbc , //
while (rsk.next()) {
String name = rsk.getString("COLUMN_NAME");//
keySet.add(lowerCase(name.toLowerCase()));//
}
Object[] k = keySet.toArray();
String[] keys = new String[k.length];
for (int i = 0; i < k.length; i++) {
keys[i] = (String) k[i];
field_map.get(keys[i]).setPrimarykey(true);// mssql、mysql、derby
}
table.setKeys(keys);
// ,
/// Field typeClassName
String squeryFieldTypeClassName = "select * from " + tableName.toLowerCase() + " where " + table.getFields()[0] + " is null";
if (table.getKeys().length > 0) {
squeryFieldTypeClassName = "select * from " + tableName.toLowerCase() + " where " + table.getKeys()[0] + " is null";
}
Statement stmt0 = con.createStatement();
ResultSet rscname = stmt0.executeQuery(squeryFieldTypeClassName);
ResultSetMetaData rsmd = rscname.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
String fieldNmae = rsmd.getColumnName(i);
field_map.get(fieldNmae.toLowerCase()).setTypeClassName(rsmd.getColumnClassName(i));// mssql、mysql、derby
}
stmt0.close();
}
tableMap.put(tableName.toLowerCase(), table);// Table
}
HashMapリレーションシップデータマッピング技術に基づくJadePoolの実装では,Dbファミリーは有限多例モードによりデータベース構造情報を動的に抽出し管理し,JadePoolの大執事である.これはHRM製品とORM製品の最も根本的な違いです.JadePoolが効率的、簡潔、インテリジェント化を実現するための重要な前提である.
ちなみにDbAccessは、非トランザクション・データベースを管理するデータベース構造情報の抽出を担当します.
DbCenterとDbAccessを使用する重要な違いは、データベースがトランザクションをサポートしているかどうかです.トランザクション型のデータベースでは、ResultSet rsk=dm.getPrimaryKeys(catalog,null,tableName)を使用できます.文は、トランザクションではなくプライマリ・キー情報を抽出します.この操作は、現在サポートされていません.現在、JadePoolは非トランザクション・データベースのテーブルの最初のフィールドをプライマリ・キーとして扱っています.
DbCenterのインスタンス化方法
ProcessVOはJadePoolのコアクラスであり、主にデータベースのCRUDまたはDML操作を実現するために使用される.現在、このクラスには3つの構造関数があります.
1、ProcessVO();DbCenterのdefaultDbインスタンスをインスタンス化します 2、ProcessVO(Connection con);DbCenterのuserDbインスタンスをインスタンス化します 3、ProcessVO(Connection con, int connectionType);これはconnectionTypeの値、例えばcn.jadepool.sql.DbConnectionType.USING_DB_01 db_をインスタンス化01,cn.jadepool.sql.DbConnectionType.USING_によるDB_02 db_をインスタンス化02.
例:
ProcessVO pvo=new ProcessVO();
Db db=pvo.getDb();
......
この場合、ユーザはdbを介してデータベースの構造情報、テーブルの構造情報、およびフィールドの構造情報にアクセスすることができる.
JadePoolに興味がある場合は、jadepool-1.0-GBKを以下のURLでダウンロードできます.
http://download.csdn.net/detail/wj800/5109413
http://www.jadepool.cn/down?id=1000