シンプルなデータ・ソースのデモの例、デザイン・モード・ベース


声明:以下は個人の理解にすぎず、正確ではなく、参考に供する.
データベースの操作は开発の中でいつも出会う1つの问题で、ちょうどJAVAを学ぶ友达にとって、データソース、接続プールのこれらの概念に対してまだ熟知していないかもしれなくて、本文は主に1つの简単な例を通じて(通って)、みんなにこれらのものを认识することを助けて、もちろん本文のいくつかの観点は必ずしも完全に正确ではありませんて、ただ参考にします.次に、接続プールについて説明します.接続プールの目的は、主にデータベース接続を繰り返し、頻繁に作成し、リソースと効果の問題を解決することです.データベース接続を確立することは、川に橋を建設することのようなもので、データの伝送は橋が建設された後、交通機関がその使用を借りることのようなものです.このように、データベース接続を確立するコストは比較的高い.データベース接続プールを構築するには、主に事前に接続を確立して接続プールに入れることです.例えば、いくつかの橋を建ててから、具体的にデータベースで接続するときは接続プールに行って取ることができます.使用するときは、川の別の岸に橋を選ぶことができます.長い間ぐるぐる回っていたので、接続プールについて初歩的な認識があったかどうか分かりません.私の所のいわゆるデータソースは実はこの一連のメカニズムと操作に対するパッケージです.
 
以下はコアコード部分ですが、実際には簡単に書くことができます.また、SimpleConnectionクラスにも一部のコードを省略しています.必要な友达はダウンロードプロジェクトをクリックすることができます.ここでは主に簡単なプレゼンテーションをして、勉強したばかりの友达がすぐに理解できるようにします.また,SimpleConnectionクラスではエージェントモード,JdbcUtilsクラスでは単一例モードを用いており,設計モードの認識にも役立つことを期待している.ダウンロードプロジェクトをクリックして、プロジェクトの使用方法は解凍して、直接Myeclipseを導入して使用することができて、Globalクラスの中で、いくつかのグローバル量の定義に対して、プレゼンテーションを便利にして、だからプロファイルを読む方式を取って実現していません.http://sites.google.com/site/gwikimo/をクリックしてダウンロードすることもできます.
(1)データソースは、主に接続プールの機能を実現しているが、プールでは接続に対するアクセス操作が比較的頻繁であるため、ここではLinkedListを用いて実現しており、相対的に効率的にArrayListより優れているはずである
 
package org.wiki.datasource.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

import org.wiki.datasource.global.Global;

/**
 *       ,            
 * @author Wiki.M
 * @version 0.1
 */
public class SimpleDataSource {
	
	//         
	private int initCount = Global.INIT_COUNT;
	
	//         
	private int maxCount = Global.MAX_COUNT;
	
	//           
	private int currentCount = 0;
	
	//         
	private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
	
	/**
	 *       ,      
	 */
	public SimpleDataSource(){
		try {
			initConnction();
		} catch (SQLException e) {
			e.printStackTrace();
			//     
			throw new ExceptionInInitializerError(e);
		}
	}
	
	/**
	 *        
	 * @return   Connection  
	 * @throws SQLException       
	 */
	private Connection createConnection() throws SQLException{
		return new SimpleConnection(DriverManager.getConnection(Global.URL, Global.USER_NAME, Global.PASSWORD),this);
	}
	
	/**
	 *      ,       ,           
	 *      LinkedList   
	 * @throws SQLException       
	 */
	private void initConnction() throws SQLException{
		for(int i = 0;i < initCount;i++){
			connectionPool.add(createConnection());
			currentCount++;
		}
	}
	
	/**
	 *             
	 * @return   Connection  
	 * @throws SQLException       
	 * @throws InterruptedException    
	 */
	public Connection getConnection() throws SQLException, InterruptedException{
		//       ,             
		synchronized(connectionPool){
			//          
			if(connectionPool.size() > 0){
				return connectionPool.removeFirst();//   LinkedList       
			}else if(currentCount < maxCount){
				//          ,                   
				return createConnection();
			}else {
				//            
				throw new SQLException("     。。。");
			}
		}
	}
	
	/**
	 *       
	 * @param conn      Connection
	 * @param st Statement    
	 * @param rs ResultSet  
	 */
	public void free(Connection conn,Statement st,ResultSet rs){
		free(conn);
		try{
			if(null != st) st.close();
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			try{
				if(null != rs) rs.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
	}
	
	/**
	 *     ,            
	 * @param conn Connection    
	 */
	public void free(Connection conn){
		connectionPool.addLast(conn);//    LinkedList  
	}
}

(2)カスタムConnection実装,このクラスを書く用途はクラス説明に明記されている
package org.wiki.datasource.core;

import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;

/**
 *    Connection   ,
 *        Connection close()                       
 *         ,  realConnection     dataSource     ,    
 *        
 * @author Wiki.M
 * @version 0.1
 */
public class SimpleConnection implements Connection{

	//      
	private Connection realConnection;
	
	//     
	private SimpleDataSource dataSource;
	
	/**
	 *       
	 * @param realConnection         
	 * @param dataSource      
	 */
	public SimpleConnection(Connection realConnection,SimpleDataSource dataSource){
		this.realConnection = realConnection;
		this.dataSource = dataSource;
	}
	
	/**
	 *            
	 */
	public void close() throws SQLException {
		System.out.println("SimpleConnection close()....");
		dataSource.free(this);
	}

}

(3)JDBCデータベース操作ツールクラス
package org.wiki.datasource.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.wiki.datasource.core.SimpleDataSource;
import org.wiki.datasource.global.Global;

/***
 * JDBC   ,         ,        
 * @author Wiki.M
 * @version 0.1
 */
public class JdbcUtils {
	
	private static JdbcUtils jdbcUtils = null;//JDBC       
	
	private static SimpleDataSource sds = null;

	/**
	 *        ,             。
	 */
	static {
		try {
			//       
			Class.forName(Global.DATABASE_DRIVER);
			//     
			sds = new SimpleDataSource();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 *       ,
	 *   new JdbcUtils()      
	 */
	private JdbcUtils() {
	}

	/**
	 *   JdbcUtils    ,  
	 * @return   JdbcUtils    
	 */
	public static JdbcUtils getInstance() {
		if (jdbcUtils == null) {
			//      ,              
			synchronized (JdbcUtils.class) {
				if (jdbcUtils == null) {
					jdbcUtils = new JdbcUtils();
					return jdbcUtils;
				}
			}
		}
		return jdbcUtils;
	}

	/**
	 *        
	 * @return   Connection    
	 * @throws InterruptedException 
	 * @throws SQLException 
	 */
	public static Connection getConnection() throws SQLException, InterruptedException {
		return sds.getConnection();
	}

	/**
	 *          
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void free(Connection conn, Statement st, ResultSet rs) {
		sds.free(conn,st,rs);
	}
}