単一例はデータベースのプライマリ・キー生成ポリシーを開発し、データベース・プラットフォームにまたがるプライマリ・キー生成方式


方向制御:管理するテーブルのプライマリ・キーとプライマリ・キーの値をすべて格納するテーブルを使用します.
表:keytable
create table keytable(
keyname varchar2(20) primary key,
keyvalue number(10) not null);
クラスを使用してクラスの生成ポリシーを管理します:Class KeyInfo
このような1つのプライマリ・キーのバッファ値範囲を一度に取り出し、getNextKey()を呼び出すたびにそのプライマリ・キーの値を返し、次のプライマリ・キー値を設定します.値は範囲内、値は取り出し、値がバッファ範囲の最大値に達した場合、データベースとインタラクティブになります.次のバッファ範囲を生成します.バッファ範囲を取り出す前にデータベースのプライマリ・キー値を更新し、バッファ範囲の失敗を回避し、次回にプライマリ・キー値を取得するために使用されます.具体的なクラスは次のとおりです.
package singleton.keySequence;

public class KeyInfo {
	
	private long minKey;
	private long maxKey;
	private int poolSize;
	private long nextKey;
	private String keyName;
	
	/**
	 * @param poolSize        
	 * @param keyName       
	 */
	public KeyInfo(int poolSize,String keyName){
		this.poolSize=poolSize;
		this.keyName=keyName;
		queryDB();
	}
	
	/**
	 * @return the value of nextKey            
	 *              ,               ,              
	 */
	public long getNextKey(){
		if(nextKey>maxKey){
			queryDB();
		}
		return nextKey++;
	}
	/**
	 *                ,              
	 */
	private void queryDB(){
		String updateSql="UPDATE KEYTABLE SET KEYVALUE=KEYVALUE+"
			+poolSize+" WHERE KEYNAME='"+keyName+"'";
		String querySql="select KEYVALUE FROM KEYTABLE WHERE KEYNAME='"+keyName+"'";
		
		JDBCTemplate.update(updateSql);
		
//		System.out.println(updateSql);
//		System.out.println(querySql);
		
		long valueFromDB=(Integer)JDBCTemplate.query(querySql);		maxKey=valueFromDB;
		minKey=maxKey-poolSize+1;
		nextKey=minKey;
	}
}
これらのプライマリ・キーの生成方法を管理するには、単一のクラスを使用します.
package singleton.keySequence;

import java.util.HashMap;
import java.util.Map;

public class KeyGenerator {
	
	private Map<String,KeyInfo> keyMap=new HashMap<String,KeyInfo>(10);
	private static final int POOL_SIZE=30;
	private static KeyGenerator keygen=new KeyGenerator();

	private KeyGenerator() {
	}
	
	public static KeyGenerator getInstance(){
		return keygen;
	}
	
	public long getNextKey(String keyName){
		if(keyMap.containsKey(keyName)){
			return keyMap.get(keyName).getNextKey();
		}else{
			KeyInfo keyInfo=new KeyInfo(POOL_SIZE,keyName);
			keyMap.put(keyName, keyInfo);
			return keyInfo.getNextKey();
		}
	}
}
JDBCアクセスデータベースクラス:
データベースツールクラス:JDBCconnectionFactory
Connectionオブジェクトとリソースのクローズの管理
/*
*(1)機能一:ユーザーに接続対象を提供する
*(2)機能3:共通のクローズを提供する
*/
package common.db;
import java.sql.*;
import java.util.*;
import java.io.*;

public class JDBCConnectionFactory 
{
	static String url;
	static String user;
	static String password;
	
	//              
	//  :     ,              。
	static
	{
		try
		{
		FileInputStream fis=new FileInputStream("common/db/dbtext");
		Properties pro=new Properties();
		pro.load(fis);
		
		url=pro.getProperty("url");
		user=pro.getProperty("username");
		password=pro.getProperty("password");
		
		fis.close();
		
		}catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	
	//   :
	public static Connection getConnection()
	{
		Connection conn=null;
		try
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection(url, user, password);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return conn;
	}
	
	//   :
	public static void close(Connection conn,ResultSet rs,Statement stmt)
	{
		try
		{
		if(conn!=null)
			conn.close();
		if(stmt!=null)
			stmt.close();
		if(rs!=null)
			rs.close();
		}catch(SQLException e){
			System.out.println(e.getMessage());
		}
	}
	
}
特定のデータベース・アクセス・クラス
package common.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTemplate {
	
	private static Connection conn=null;
	private static Statement stmt=null;
	private static ResultSet rs=null;

	public static void update(String updateSql) throws Exception{
		conn=JDBCConnectionFactory.getConnection();
		stmt=conn.createStatement();
		stmt.executeUpdate(updateSql);
		JDBCConnectionFactory.close(conn, null, stmt);
		conn=null;
		stmt=null;
	}
	
	public static Object query(String querySql)throws Exception{
		conn=JDBCConnectionFactory.getConnection();
		stmt=conn.createStatement();
		rs=stmt.executeQuery(querySql);
		int i=-1;
		while(rs.next()){
			i=rs.getInt(1);
			if(i!=-1)
				break;
		}
		JDBCConnectionFactory.close(conn, rs, stmt);
		conn=null;
		stmt=null;
		return i;
	}
}
以下はテストクラスです
package singleton.keySequence;

public class ClientTest {
	
	public static void main(String[] args) throws Exception{
		
		KeyGenerator key=KeyGenerator.getInstance();
		for(int i=0;i<15;i++){
		System.out.println(key.getNextKey("person_id"));
		System.out.println(key.getNextKey("person_id"));
		}
	}
}
以上はMyEclipseとOracle 9 iでテストに合格しました.
友達の交流を歓迎します[email protected]