1. 程式人生 > >從配置檔案或資料庫中讀取資訊並快取

從配置檔案或資料庫中讀取資訊並快取

在專案中將一些常用的不變的資訊可以快取起來,這樣可以減少記憶體的使用率,提高效能。比如說就資料庫連線的相關資訊等,可以用單例模式第一次進行連線的時候將資料庫連線的相關資訊快取再單例物件中。


首先建個.properties檔案,存放資料庫連線資訊,內容如下:

#資料庫配置
driver_class = oracle.jdbc.driver.OracleDriver
url= jdbc:oracle:thin:@192.168.20.188:1521:orcl
username = qwszpt
password = rxqwszpt

建立兩個單例類,一個用於快取資料庫連線資訊,一個用於快取查詢的結果集。

package wbb.java.GetConfiguration.singleton;

import java.util.Map;

/**
 * User: wbb
 * Date: 14-8-11
 * Time: 上午11:12
 * 快取資料庫連線資訊的單例
 */
public class DbConfig {
    private Map<String,String> sysConfig;
    private static DbConfig instance = null;

    public static synchronized DbConfig getInstance()
    {
        if (instance == null)
        {
            instance = new DbConfig();
        }
        return instance;
    }

    //清楚物件中快取的內容
    public void clearSysConfig() {
        sysConfig = null;
    }

    public Map<String, String> getSysConfig() {
        return sysConfig;
    }

    public void setSysConfig(Map<String, String> sysConfig) {
        this.sysConfig = sysConfig;
    }
}

package wbb.java.GetConfiguration.singleton;

import java.util.Map;

/**
 * User: wbb
 * Date: 14-8-11
 * Time: 上午11:25
 * 快取查詢資訊的單例
 */
public class QueryConfig {
    private Map<String, String> queryConfig;
    private static QueryConfig instance = null;

    public static synchronized QueryConfig getInstance() {
        if(instance == null) {
            instance = new QueryConfig();
        }
        return instance;
    }

    //清楚物件中快取的內容
    public void clearQueryConfig() {
        queryConfig = null;
    }

    public Map<String, String> getQueryConfig() {
        return queryConfig;
    }

    public void setQueryConfig(Map<String, String> queryConfig) {
        this.queryConfig = queryConfig;
    }
}

建立一個讀取或寫入系統配置檔案的工具類。
package wbb.java.GetConfiguration.utils;

import wbb.java.GetConfiguration.singleton.DbConfig;
import wbb.java.GetConfiguration.singleton.QueryConfig;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * User: wbb
 * Date: 14-8-11
 * Time: 上午11:05
 * 讀取或寫入系統配置檔案的工具類
 */
public class SystemConfigUtil {
    /**
     * 從配置檔案中讀取配置資訊
     *
     * @return 配置資訊properties
     * @throws IOException
     */
    public static Properties getProperties() throws IOException {
        Properties prop = new Properties();
        InputStream in = Object.class.getResourceAsStream("/config.properties");
        prop.load(in);
        return prop;
    }

    /**
     * 將資料庫配置資訊寫入到dbConfig中
     *
     * @param config 資料庫配置資訊
     */
    public static void setDBConfig(Properties config) {
        Map<String, String> configMap = new HashMap<String, String>();
        //迭代配置檔案中的配置,並放到map中
        for (Enumeration e = config.propertyNames(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            String value = config.getProperty(key);
            configMap.put(key, value);
        }
        //將配置寫入到單例中
        DbConfig dbConfig = DbConfig.getInstance();
        dbConfig.setSysConfig(configMap);
    }

    /**
     * 讀取查詢配置,並寫入到queryConfig中
     */
    public static void setQueryConfig(ResultSet rs) throws SQLException {
        String key = null;
        String value = null;
        Map queryConfigMap = new HashMap();
        while (rs.next()) {
            key = rs.getString("DM");
            value = rs.getString("PZZ");
            queryConfigMap.put(key, value);
            System.out.println("程式碼為:" + key + "對應的配置值是:" + value);
        }
        //將查詢配置資訊寫入queryConfig
        QueryConfig queryConfig = QueryConfig.getInstance();
        //清除原有物件
        queryConfig.clearQueryConfig();
        //構造新物件
        queryConfig.setQueryConfig(queryConfigMap);
    }
}

建立測試類
package wbb.java.GetConfiguration;

import wbb.java.GetConfiguration.singleton.DbConfig;
import wbb.java.GetConfiguration.utils.SystemConfigUtil;

import java.io.IOException;
import java.sql.*;
import java.util.Map;
import java.util.Properties;

/**
 * User: wbb
 * Date: 14-8-11
 * Time: 上午11:03
 * 測試從配置檔案中讀取
 */
public class GetConfigurationFromProperties {
    public static void main(String[] args) {
        Properties properties = null;
        /**
         * 從配置檔案中讀取配置資訊,並快取到DbConfig單例物件中
         */
        try {
            //讀取配置檔案
            properties = SystemConfigUtil.getProperties();
            //將資料庫配置寫入(快取)到dbconfig
            SystemConfigUtil.setDBConfig(properties);
            //獲取資料庫連線資訊的例項
            Map<String, String> dbConfig = DbConfig.getInstance().getSysConfig();

            /**
             * 從資料庫中讀取資訊並快取到QueryConfig單例物件中
             */

            //連線資料庫
            Connection conn = null;
            Class.forName(dbConfig.get("driver_class"));
            conn = DriverManager.getConnection(dbConfig.get("url"), dbConfig.get("username"), dbConfig.get("password"));

            //獲取執行sql語句的物件
            Statement stmt =null;
            stmt = conn.createStatement();

            //執行sql語句,獲取結果集
            ResultSet rs=null;
            rs=stmt.executeQuery("select * from t_pz_xtpz");

            //將查詢資訊寫入(快取)到queryconfig
            SystemConfigUtil.setQueryConfig(rs);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("讀取配置檔案失敗");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("沒有找到驅動檔案");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("資料庫連線失敗");
        }
    }
}