まず第一に、プール可能なオブジェクトが必要です。ここでは、私が自分で書いた 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); } }
Go 言語の gorm フレームワークと Redis フレームワークを学習してから、プーリング関連の情報を公開する必要がないことがわかりました。元の API を直接カプセル化し、これをユーザーに公開することで、ユーザーは接続のリサイクルについて心配する必要がなくなります。
rree以上がMySQL プールされたカスタム インスタンスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。