91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL池化自定義實例分析

發布時間:2022-07-22 10:16:15 來源:億速云 閱讀:137 作者:iii 欄目:開發技術

本篇內容主要講解“MySQL池化自定義實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL池化自定義實例分析”吧!

可池化對象

首先,我們需要一個可池化對象,這里我選用了com.funtester.db.mysql.FunMySql,這是一個我自己寫的單鏈接的MySQL對象。我計劃用這個作為基礎可池化對象。

package com.funtester.db.mysql;
import com.funtester.base.interfaces.IMySqlBasic;
import com.funtester.config.SqlConstant;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
 * mysql操作的基礎類
 * <p>用于存儲數據,多用于爬蟲</p>
 */
public class FunMySql extends SqlBase implements IMySqlBasic {
    /**
     *  {@link SqlConstant#FUN_SQL_URL}會替換IP到URL
     */
    String url;
    /**
     * 庫
     */
    String database;
    /**
     * 用戶
     */
    String user;
    /**
     * 密碼
     */
    String password;
    Connection connection;
    Statement statement;
    /**
     * 私有構造方法
     *
     * @param url      連接地址,包括端口
     * @param database 庫
     * @param user     用戶名
     * @param password 密碼
     */
    public FunMySql(String url, String database, String user, String password) {
        this.url = url;
        this.database = database;
        this.user = user;
        this.password = password;
        getConnection(database);
    }
    /**
     * 初始化連接
     */
    @Override
    public void getConnection() {
        getConnection(EMPTY);
    }
    /**
     * 執行sql語句,非query語句,并不關閉連接
     *
     * @param sql
     */
    @Override
    public void executeUpdateSql(String sql) {
        SqlBase.executeUpdateSql(connection, statement, sql);
    }
    /**
     * 查詢功能
     *
     * @param sql
     * @return
     */
    @Override
    public ResultSet executeQuerySql(String sql) {
        return SqlBase.executeQuerySql(connection, statement, sql);
    }
    /**
     * 關閉query連接
     */
    @Override
    public void over() {
        SqlBase.close(connection, statement);
    }
    @Override
    public void getConnection(String database) {
        if (connection == null)
            connection = SqlBase.getConnection(SqlConstant.FUN_SQL_URL.replace("ip", url).replace("database", database), user, password);
        if (statement == null) statement = SqlBase.getStatement(connection);
    }
}

池化工廠

相對連接,創建com.funtester.db.mysql.FunMySql的時候,順便一起初始化MySQL連接。然后再com.funtester.db.mysql.MysqlPool.FunTester#destroyObject的時候進行連接的回收。

    /**
     * 池化工廠類
     */
    private class FunTester extends BasePooledObjectFactory<FunMySql> {
        @Override
        FunMySql create() throws Exception {
            return new FunMySql(url, database, user, password)
        }
        @Override
        PooledObject<FunMySql> wrap(FunMySql obj) {
            return new DefaultPooledObject<FunMySql>(obj)
        }
        @Override
        void destroyObject(PooledObject<FunMySql> p) throws Exception {
            p.getObject().over()
            super.destroyObject(p)
        }
    }

對象池

這里顯得有些冗余,后面再使用過程中,我會繼續優化。通過創建一個com.funtester.db.mysql.MysqlPool對象,獲取一個com.funtester.db.mysql.FunMySql對象池。

/**
 * 自定義MySQL連接池對象
 */
class MysqlPool extends PoolConstant {
    private static final Logger logger = LogManager.getLogger(MysqlPool.class);
    /**
     * {@link com.funtester.config.SqlConstant#FUN_SQL_URL}會替換IP到URL*/
    String url;
    /**
     * 庫
     **/
    String database;
    /**
     * 用戶
     **/
    String user;
    /**
     * 密碼
     **/
    String password;
    private GenericObjectPool<FunMySql> pool
    MysqlPool(String url, String database, String user, String password) {
        this.url = url
        this.database = database
        this.user = user
        this.password = password
        init()
    }
    /**
     * 初始化連接池
     * @return
     */
    def init() {
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        poolConfig.setMaxTotal(MAX);
        poolConfig.setMinIdle(MIN_IDLE);
        poolConfig.setMaxIdle(MAX_IDLE);
        poolConfig.setMaxWaitMillis(MAX_WAIT_TIME);
        poolConfig.setMinEvictableIdleTimeMillis(MAX_IDLE_TIME);
        pool = new GenericObjectPool<FunMySql>(new FunTester(), poolConfig);
    }
}

API封裝

自從學習了Go語言的gorm框架和Redis框架,我發現其實不用把池化相關信息不用暴露出來,直接封裝原始的API,暴露給用戶使用,這樣用戶就不用關心連接的回收問題了。

    /**
     * 借出對象
     * @return
     */
    def borrow() {
        try {
            return pool.borrowObject()
        } catch (e) {
            logger.warn("獲取${JSONObject.class} 失敗", e)
        } finally {
            new JSONObject()
        }
    }
    /**
     * 歸還對象
     * @param funMySql
     * @return
     */
    def back(FunMySql funMySql) {
        pool.returnObject(funMySql)
    }
    /**
     * 執行update SQL
     * @param sql
     * @return
     */
    def execute(def sql) {
        def driver = borrow()
        try {
            driver.executeUpdateSql(sql)
        } catch (e) {
            logger.warn("執行:{}失敗", sql)
        } finally {
            back(driver)
        }
    }
    /**
     * 執行查詢SQL
     * @param sql
     * @return
     */
    def query(def sql) {
        def driver = borrow()
        try {
            return driver.executeQuerySql(sql)
        } catch (e) {
            logger.warn("執行:{}失敗", sql)
        } finally {
            back(driver)
        }
    }

到此,相信大家對“MySQL池化自定義實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿图什市| 海城市| 右玉县| 镇赉县| 巴东县| 瑞丽市| 迭部县| 九台市| 天峻县| 晋江市| 新疆| 乌苏市| 梅州市| 固始县| 巴楚县| 舒城县| 丹江口市| 鹿泉市| 湖北省| 宁乡县| 黄浦区| 渝北区| 河池市| 韩城市| 定边县| 新龙县| 广水市| 浙江省| 伊金霍洛旗| 屏南县| 清原| 县级市| 上栗县| 仙游县| 千阳县| 华容县| 双辽市| 墨玉县| 建始县| 申扎县| 肃北|