溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL池化自定義實(shí)例分析

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

本篇內(nèi)容主要講解“MySQL池化自定義實(shí)例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“MySQL池化自定義實(shí)例分析”吧!

可池化對(duì)象

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

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操作的基礎(chǔ)類
 * <p>用于存儲(chǔ)數(shù)據(jù),多用于爬蟲</p>
 */
public class FunMySql extends SqlBase implements IMySqlBasic {
    /**
     *  {@link SqlConstant#FUN_SQL_URL}會(huì)替換IP到URL
     */
    String url;
    /**
     * 庫
     */
    String database;
    /**
     * 用戶
     */
    String user;
    /**
     * 密碼
     */
    String password;
    Connection connection;
    Statement statement;
    /**
     * 私有構(gòu)造方法
     *
     * @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);
    }
    /**
     * 執(zhí)行sql語句,非query語句,并不關(guān)閉連接
     *
     * @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);
    }
    /**
     * 關(guān)閉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);
    }
}

池化工廠

相對(duì)連接,創(chuàng)建com.funtester.db.mysql.FunMySql的時(shí)候,順便一起初始化MySQL連接。然后再com.funtester.db.mysql.MysqlPool.FunTester#destroyObject的時(shí)候進(jìn)行連接的回收。

    /**
     * 池化工廠類
     */
    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)
        }
    }

對(duì)象池

這里顯得有些冗余,后面再使用過程中,我會(huì)繼續(xù)優(yōu)化。通過創(chuàng)建一個(gè)com.funtester.db.mysql.MysqlPool對(duì)象,獲取一個(gè)com.funtester.db.mysql.FunMySql對(duì)象池。

/**
 * 自定義MySQL連接池對(duì)象
 */
class MysqlPool extends PoolConstant {
    private static final Logger logger = LogManager.getLogger(MysqlPool.class);
    /**
     * {@link com.funtester.config.SqlConstant#FUN_SQL_URL}會(huì)替換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封裝

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

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

到此,相信大家對(duì)“MySQL池化自定義實(shí)例分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI