Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 代码发布 › JAVA如何自定义Mysql连接池

JAVA如何自定义Mysql连接池

Eswlnk的头像
Eswlnk
2022-06-27 13:27:20
JAVA如何自定义Mysql连接池-Eswlnk Blog
智能摘要 AI
本文主要介绍了如何使用commons-pool2创建MySQL连接池的过程。作者最初尝试优化HTTP性能未果,后发现Jedis也使用了commons-pool2。接着,作者创建了一个可池化的MySQL对象`FunMySql`,并设计了池化工厂`FunTester`来初始化和回收连接。通过`MysqlPool`类实现了连接池的初始化配置,设置了最大连接数、最小空闲连接等参数。最后,作者封装了API接口,简化了用户操作,隐藏了连接池的具体实现细节,提供了便捷的SQL执行和查询方法。

在学会了commons-pool2的通用模型后,我又尝试了一下 HTTP的性能,但却没有任何效果。在我自己的现场试验中,它的表现非常出色。我事后一琢磨,发现自己用得不对。原本我还打算自己编写 Redis的链接,但是 Jedis的链接竟然是commons-pool2的,这让我有些惊讶,似乎也是这么想的。commons-pool2用于创建一个链接池很好。

JAVA如何自定义Mysql连接池-Eswlnk Blog

我仔细搜索了一下,发现缺少一个本地 MySQL连接池,而非像 springboot一样,必须先启动一项服务。当然,我也有,但是我很想自己做一份,做一些测试,所以就没有去看。

可池化对象

首先,我们需要一个可池化的对象,我选择了我自己编写的 MySQL对象com.funtester.db.my SQL。我打算把它当作一个基本的可池化对象。

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)
        }
    }
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
javamysqlmysql连接数据库sql优化string技术学习连接池
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
如何将震源球绘制在谷歌地球上
上一篇
Go语言错误处理为什么更推荐使用pkg/errors 三方库?
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「攻防对抗」利用 fastjson 原生反序列化与动态代理突破安全限制
  • 「日志记录」逆向必应翻译网页版API实现免费调用
  • 「代码分享」第三方平台VIP视频解析API接口
  • 「至臻原创」某系统网站登录功能监测
  • 「JAVA教程」Spring Boot 中使用 JSON Schema 来校验复杂JSON数据
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

「代码发布」k8s 网络转发问题记录
2022-08-16 16:16:25
Go语言错误处理为什么更推荐使用pkg/errors 三方库?
2022-06-27 13:39:45
「日志记录」逆向必应翻译网页版API实现免费调用
2025-02-07 22:02:20

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.560 秒   |  SQL查询 47 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈