Java实现数据库连接池的代码

Java实现数据库连接池核心代码与原理详解 本章从Connection的获取流程、归还处理机制到代理封装技术,详细阐述了连接池中Connection对象的生命周期管理逻辑。通过对连接池内部状态的精细控制,连接池能够高效地复用连接资源,提升系统性能,同时避免资源泄漏和线程竞争问题。下一章我们将继续深入探讨数据库连接的创建策略,包括连接预加载、参数配置以及连接健康检查机制等内容。数据库连接的创建策略是连接池设计中的核心部分。预创建连接和按需创建连接各有优劣,适用于不同的业务场景。连接参数的合理配置直接影响连接的性能与安全性。 阅读详情

  1. package com.kyo.connection;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DatabaseMetaData;  
  5. import java.sql.Driver;  
  6. import java.sql.DriverManager;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9. import java.util.Enumeration;  
  10. import java.util.Vector;  
  11.   
  12. public class ConnectionPool {  
  13.   
  14.     private ConnectionParam param;  
  15.   
  16.     private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表  
  17.   
  18.     private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为  
  19.                                         // null,它中存放的对象为PooledConnection 型  
  20.   
  21.     public void setParam(ConnectionParam param) {  
  22.         this.param = param;  
  23.     }  
  24.   
  25.     public ConnectionParam getParam() {  
  26.         return param;  
  27.     }  
  28.   
  29.     /** 
  30.      * 构造函数 
  31.      *  
  32.      * @param param 
  33.      */  
  34.     public ConnectionPool(ConnectionParam param) {  
  35.         this.param = param;  
  36.     }  
  37.   
  38.     /** 
  39.      *  
  40.      * 获取测试数据库表的名字 
  41.      *  
  42.      * @return 测试数据库表的名字 
  43.      */  
  44.   
  45.     public String getTestTable() {  
  46.         return this.testTable;  
  47.     }  
  48.   
  49.     /** 
  50.      *  
  51.      * 设置测试表的名字 
  52.      *  
  53.      * @param testTable 
  54.      *            String 测试表的名字 
  55.      */  
  56.   
  57.     public void setTestTable(String testTable) {  
  58.         this.testTable = testTable;  
  59.     }  
  60.   
  61.     /** 
  62.      * 创建一个数据库连接池,连接池中的可用连接的数量采用类成员 initialConnections 中设置的值 
  63.      */  
  64.   
  65.     public synchronized void createPool() throws Exception {  
  66.   
  67.         // 确保连接池没有创建  
  68.         // 如果连接池己经创建了,保存连接的向量 connections 不会为空  
  69.         if (connections != null) {  
  70.             return; // 如果己经创建,则返回  
  71.         }  
  72.   
  73.         // 实例化 JDBC Driver 中指定的驱动类实例  
  74.         Driver driver = (Driver) (Class.forName(this.param.getDriver())  
  75.                 .newInstance());  
  76.         DriverManager.registerDriver(driver); // 注册 JDBC 驱动程序  
  77.         // 创建保存连接的向量 , 初始时有 0 个元素  
  78.         connections = new Vector();  
  79.   
  80.         // 根据 initialConnections 中设置的值,创建连接。  
  81.         createConnections(this.param.getMinConnection());  
  82.         System.out.println(" 数据库连接池创建成功! ");  
  83.   
  84.     }  
  85.   
  86.     /** 
  87.      *  
  88.      * 创建由 numConnections 指定数目的数据库连接 , 并把这些连接 放入 connections 向量中 
  89.      *  
  90.      * @param numConnections 
  91.      *            要创建的数据库连接的数目 
  92.      */  
  93.   
  94.     private void createConnections(int numConnections) throws SQLException {  
  95.   
  96.         // 循环创建指定数目的数据库连接  
  97.         for (int x = 0; x < numConnections; x++) {  
  98.             // 是否连接池中的数据库连接的数量己经达到最大?最大值由类成员 maxConnections,指出,如果 maxConnections  
  99.             // 为 0 或负数,表示连接数量没有限制。  
  100.             // 如果连接数己经达到最大,即退出。  
  101.   
  102.             if (this.param.getMaxConnection() > 0  
  103.                     && this.connections.size() >= this.param.getMaxConnection()) {  
  104.                 break;  
  105.             }  
  106.   
  107.             // add a new PooledConnection object to connections vector  
  108.             // 增加一个连接到连接池中(向量 connections 中)  
  109.             try {  
  110.                 connections.addElement(new PooledConnection(newConnection()));  
  111.             } catch (SQLException e) {  
  112.                 System.out.println(" 创建数据库连接失败! " + e.getMessage());  
  113.                 throw new SQLException();  
  114.             }  
  115.   
  116.             System.out.println(" 数据库连接己创建 ......");  
  117.         }  
  118.   
  119.     }  
  120.   
  121.     /** 
  122.      *  
  123.      * 创建一个新的数据库连接并返回它 
  124.      *  
  125.      * @return 返回一个新创建的数据库连接 
  126.      */  
  127.   
  128.     private Connection newConnection() throws SQLException {  
  129.   
  130.         // 创建一个数据库连接  
  131.         Connection conn = DriverManager.getConnection(this.param.getUrl(),  
  132.                 this.param.getUser(), this.param.getPassword());  
  133.   
  134.         // 如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的  
  135.         // 最大客户连接数目  
  136.         // connections.size()==0 表示目前没有连接己被创建  
  137.   
  138.         if (connections.size() == 0) {  
  139.   
  140.             DatabaseMetaData metaData = conn.getMetaData();  
  141.             int driverMaxConnections = metaData.getMaxConnections();  
  142.   
  143.             // 数据库返回的 driverMaxConnections 若为 0 ,表示此数据库没有最大  
  144.             // 连接限制,或数据库的最大连接限制不知道  
  145.             // driverMaxConnections 为返回的一个整数,表示此数据库允许客户连接的数 目  
  146.             // 如果连接池中设置的最大连接数量大于数据库允许的连接数目 , 则置连接池 的最大  
  147.             // 连接数目为数据库允许的最大数目  
  148.   
  149.             if (driverMaxConnections > 0  
  150.                     && this.param.getMaxConnection() > driverMaxConnections) {  
  151.                 this.param.setMaxConnection(driverMaxConnections);  
  152.             }  
  153.         }  
  154.         return conn; // 返回创建的新的数据库连接  
  155.     }  
  156.   
  157.     /** 
  158.      *  
  159.      * 通过调用 getFreeConnection() 函数返回一个可用的数据库连接 , 
  160.      *  
  161.      * 如果当前没有可用的数据库连接,并且更多的数据库连接不能创 
  162.      *  
  163.      * 建(如连接池大小的限制),此函数等待一会再尝试获取。 
  164.      *  
  165.      * @return 返回一个可用的数据库连接对象 
  166.      */  
  167.   
  168.     public synchronized Connection getConnection() throws SQLException {  
  169.   
  170.         // 确保连接池己被创建  
  171.         if (connections == null) {  
  172.             return null; // 连接池还没创建,则返回 null  
  173.         }  
  174.   
  175.         Connection conn = getFreeConnection(); // 获得一个可用的数据库连接  
  176.         // 如果目前没有可以使用的连接,即所有的连接都在使用中  
  177.   
  178.         while (conn == null) {  
  179.             // 等一会再试  
  180.             wait(250);  
  181.             conn = getFreeConnection(); // 重新再试,直到获得可用的连接,如果  
  182.             // getFreeConnection() 返回的为 null  
  183.             // 则表明创建一批连接后也不可获得可用连接  
  184.         }  
  185.   
  186.         return conn;// 返回获得的可用的连接  
  187.     }  
  188.   
  189.     /** 
  190.      *  
  191.      * 本函数从连接池向量 connections 中返回一个可用的的数据库连接,如果 
  192.      *  
  193.      * 当前没有可用的数据库连接,本函数则根据 incrementalConnections 设置 
  194.      *  
  195.      * 的值创建几个数据库连接,并放入连接池中。 
  196.      *  
  197.      * 如果创建后,所有的连接仍都在使用中,则返回 null 
  198.      *  
  199.      * @return 返回一个可用的数据库连接 
  200.      */  
  201.   
  202.     private Connection getFreeConnection() throws SQLException {  
  203.   
  204.         // 从连接池中获得一个可用的数据库连接  
  205.         Connection conn = findFreeConnection();  
  206.         if (conn == null) {  
  207.             // 如果目前连接池中没有可用的连接  
  208.             // 创建一些连接  
  209.             createConnections(this.param.getIncrementalConnections());  
  210.             // 重新从池中查找是否有可用连接  
  211.             conn = findFreeConnection();  
  212.             if (conn == null) {  
  213.                 // 如果创建连接后仍获得不到可用的连接,则返回 null  
  214.                 return null;  
  215.             }  
  216.         }  
  217.         return conn;  
  218.   
  219.     }  
  220.   
  221.     /** 
  222.      *  
  223.      * 查找连接池中所有的连接,查找一个可用的数据库连接, 
  224.      *  
  225.      * 如果没有可用的连接,返回 null 
  226.      *  
  227.      * @return 返回一个可用的数据库连接 
  228.      */  
  229.   
  230.     private Connection findFreeConnection() throws SQLException {  
  231.   
  232.         Connection conn = null;  
  233.         PooledConnection pConn = null;  
  234.         // 获得连接池向量中所有的对象  
  235.         Enumeration enumerate = connections.elements();  
  236.         // 遍历所有的对象,看是否有可用的连接  
  237.         while (enumerate.hasMoreElements()) {  
  238.             pConn = (PooledConnection) enumerate.nextElement();  
  239.             if (!pConn.isBusy()) {  
  240.                 // 如果此对象不忙,则获得它的数据库连接并把它设为忙  
  241.                 conn = pConn.getConnection();  
  242.                 pConn.setBusy(true);  
  243.                 // 测试此连接是否可用  
  244.                 if (!testConnection(conn)) {  
  245.                     // 如果此连接不可再用了,则创建一个新的连接,  
  246.                     // 并替换此不可用的连接对象,如果创建失败,返回 null  
  247.                     try {  
  248.                         conn = newConnection();  
  249.                     } catch (SQLException e) {  
  250.                         System.out.println(" 创建数据库连接失败! " + e.getMessage());  
  251.                         return null;  
  252.                     }  
  253.                     pConn.setConnection(conn);  
  254.                 }  
  255.                 break; // 己经找到一个可用的连接,退出  
  256.             }  
  257.         }  
  258.   
  259.         return conn;// 返回找到到的可用连接  
  260.   
  261.     }  
  262.   
  263.     /** 
  264.      *  
  265.      * 测试一个连接是否可用,如果不可用,关掉它并返回 false 
  266.      *  
  267.      * 否则可用返回 true 
  268.      *  
  269.      *  
  270.      *  
  271.      * @param conn 
  272.      *            需要测试的数据库连接 
  273.      *  
  274.      * @return 返回 true 表示此连接可用, false 表示不可用 
  275.      */  
  276.   
  277.     private boolean testConnection(Connection conn) {  
  278.   
  279.         try {  
  280.   
  281.             // 判断测试表是否存在  
  282.             if (testTable.equals("")) {  
  283.                 // 如果测试表为空,试着使用此连接的 setAutoCommit() 方法  
  284.                 // 来判断连接否可用(此方法只在部分数据库可用,如果不可用 ,  
  285.                 // 抛出异常)。注意:使用测试表的方法更可靠  
  286.                 conn.setAutoCommit(true);  
  287.             } else {  
  288.                 // 有测试表的时候使用测试表测试  
  289.                 // check if this connection is valid  
  290.                 Statement stmt = conn.createStatement();  
  291.                 stmt.execute("select count(*) from " + testTable);  
  292.             }  
  293.   
  294.         } catch (SQLException e) {  
  295.             // 上面抛出异常,此连接己不可用,关闭它,并返回 false;  
  296.             closeConnection(conn);  
  297.             return false;  
  298.         }  
  299.         // 连接可用,返回 true  
  300.         return true;  
  301.   
  302.     }  
  303.   
  304.     /** 
  305.      *  
  306.      * 此函数返回一个数据库连接到连接池中,并把此连接置为空闲。 
  307.      *  
  308.      * 所有使用连接池获得的数据库连接均应在不使用此连接时返回它。 
  309.      *  
  310.      * @param 需返回到连接池中的连接对象 
  311.      */  
  312.   
  313.     public void returnConnection(Connection conn) {  
  314.   
  315.         // 确保连接池存在,如果连接没有创建(不存在),直接返回  
  316.   
  317.         if (connections == null) {  
  318.             System.out.println(" 连接池不存在,无法返回此连接到连接池中 !");  
  319.             return;  
  320.         }  
  321.   
  322.         PooledConnection pConn = null;  
  323.         Enumeration enumerate = connections.elements();  
  324.         // 遍历连接池中的所有连接,找到这个要返回的连接对象  
  325.         while (enumerate.hasMoreElements()) {  
  326.             pConn = (PooledConnection) enumerate.nextElement();  
  327.             // 先找到连接池中的要返回的连接对象  
  328.             if (conn == pConn.getConnection()) {  
  329.                 // 找到了 , 设置此连接为空闲状态  
  330.                 pConn.setBusy(false);  
  331.                 break;  
  332.             }  
  333.   
  334.         }  
  335.   
  336.     }  
  337.   
  338.     /** 
  339.      *  
  340.      * 刷新连接池中所有的连接对象 
  341.      *  
  342.      *  
  343.      */  
  344.   
  345.     public synchronized void refreshConnections() throws SQLException {  
  346.   
  347.         // 确保连接池己创新存在  
  348.         if (connections == null) {  
  349.             System.out.println(" 连接池不存在,无法刷新 !");  
  350.             return;  
  351.         }  
  352.   
  353.         PooledConnection pConn = null;  
  354.         Enumeration enumerate = connections.elements();  
  355.         while (enumerate.hasMoreElements()) {  
  356.             // 获得一个连接对象  
  357.             pConn = (PooledConnection) enumerate.nextElement();  
  358.             // 如果对象忙则等 5 秒 ,5 秒后直接刷新  
  359.             if (pConn.isBusy()) {  
  360.                 wait(5000); // 等 5 秒  
  361.             }  
  362.   
  363.             // 关闭此连接,用一个新的连接代替它。  
  364.             closeConnection(pConn.getConnection());  
  365.             pConn.setConnection(newConnection());  
  366.             pConn.setBusy(false);  
  367.         }  
  368.   
  369.     }  
  370.   
  371.     /** 
  372.      *  
  373.      * 关闭连接池中所有的连接,并清空连接池。 
  374.      */  
  375.   
  376.     public synchronized void closeConnectionPool() throws SQLException {  
  377.   
  378.         // 确保连接池存在,如果不存在,返回  
  379.         if (connections == null) {  
  380.             System.out.println(" 连接池不存在,无法关闭 !");  
  381.             return;  
  382.         }  
  383.         PooledConnection pConn = null;  
  384.         Enumeration enumerate = connections.elements();  
  385.         while (enumerate.hasMoreElements()) {  
  386.             pConn = (PooledConnection) enumerate.nextElement();  
  387.             // 如果忙,等 5 秒  
  388.             if (pConn.isBusy()) {  
  389.                 wait(5000); // 等 5 秒  
  390.             }  
  391.             // 5 秒后直接关闭它  
  392.             closeConnection(pConn.getConnection());  
  393.             // 从连接池向量中删除它  
  394.             connections.removeElement(pConn);  
  395.         }  
  396.   
  397.         // 置连接池为空  
  398.         connections = null;  
  399.     }  
  400.   
  401.     /** 
  402.      *  
  403.      * 关闭一个数据库连接 
  404.      *  
  405.      * @param 需要关闭的数据库连接 
  406.      */  
  407.   
  408.     private void closeConnection(Connection conn) {  
  409.         try {  
  410.             conn.close();  
  411.         } catch (SQLException e) {  
  412.             System.out.println(" 关闭数据库连接出错: " + e.getMessage());  
  413.         }  
  414.     }  
  415.   
  416.     /** 
  417.      *  
  418.      * 使程序等待给定的毫秒数 
  419.      *  
  420.      * @param 给定的毫秒数 
  421.      */  
  422.   
  423.     private void wait(int mSeconds) {  
  424.         try {  
  425.             Thread.sleep(mSeconds);  
  426.         } catch (InterruptedException e) {  
  427.         }  
  428.     }  
  429.   
  430.     /** 
  431.      *  
  432.      * 内部使用的用于保存连接池中连接对象的类 此类中有两个成员,一个是数据库的连接,另一个是指示此连接是否 正在使用的标志。 
  433.      */  
  434.   
  435.     class PooledConnection {  
  436.   
  437.         Connection connection = null;// 数据库连接  
  438.   
  439.         boolean busy = false; // 此连接是否正在使用的标志,默认没有正在使用  
  440.   
  441.         // 构造函数,根据一个 Connection 构告一个 PooledConnection 对象  
  442.         public PooledConnection(Connection connection) {  
  443.             this.connection = connection;  
  444.         }  
  445.   
  446.         // 返回此对象中的连接  
  447.         public Connection getConnection() {  
  448.             return connection;  
  449.         }  
  450.   
  451.         // 设置此对象的,连接  
  452.         public void setConnection(Connection connection) {  
  453.             this.connection = connection;  
  454.         }  
  455.   
  456.         // 获得对象连接是否忙  
  457.         public boolean isBusy() {  
  458.             return busy;  
  459.         }  
  460.   
  461.         // 设置对象的连接正在忙  
  462.         public void setBusy(boolean busy) {  
  463.             this.busy = busy;  
  464.         }  
  465.   
  466.     }  
  467. }  


ConnectionParam.java 
Java代码 
  1. package com.kyo.connection;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. /** 
  6.  * @author niudongjie.pt 数据库连接池参数 
  7.  */  
  8. public class ConnectionParam implements Serializable {  
  9.   
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = 1L;  
  14.   
  15.     private String driver; // 数据库连接驱动  
  16.     private String url; // 数据库连接URL  
  17.     private String user; // 数据库连接user  
  18.     private String password; // 数据库连接password  
  19.     private int minConnection; // 数据库连接池最小连接数  
  20.     private int maxConnection; // 数据库连接池最大连接数  
  21.     private long timeoutValue; // 连接的最大空闲时间  
  22.     private long waitTime; // 取得连接的最大等待时间  
  23.     private int incrementalConnections=5; //连接池自动增加连接的数量  
  24.       
  25.     public String getDriver() {  
  26.         return driver;  
  27.     }  
  28.   
  29.     public void setDriver(String driver) {  
  30.         this.driver = driver;  
  31.     }  
  32.   
  33.     public String getUrl() {  
  34.         return url;  
  35.     }  
  36.   
  37.     public void setUrl(String url) {  
  38.         this.url = url;  
  39.     }  
  40.   
  41.     public String getUser() {  
  42.         return user;  
  43.     }  
  44.   
  45.     public void setUser(String user) {  
  46.         this.user = user;  
  47.     }  
  48.   
  49.     public String getPassword() {  
  50.         return password;  
  51.     }  
  52.   
  53.     public void setPassword(String password) {  
  54.         this.password = password;  
  55.     }  
  56.   
  57.     public int getMinConnection() {  
  58.         return minConnection;  
  59.     }  
  60.   
  61.     public void setMinConnection(int minConnection) {  
  62.         this.minConnection = minConnection;  
  63.     }  
  64.   
  65.     public int getMaxConnection() {  
  66.         return maxConnection;  
  67.     }  
  68.   
  69.     public void setMaxConnection(int maxConnection) {  
  70.         this.maxConnection = maxConnection;  
  71.     }  
  72.   
  73.     public long getTimeoutValue() {  
  74.         return timeoutValue;  
  75.     }  
  76.   
  77.     public void setTimeoutValue(long timeoutValue) {  
  78.         this.timeoutValue = timeoutValue;  
  79.     }  
  80.   
  81.     public long getWaitTime() {  
  82.         return waitTime;  
  83.     }  
  84.   
  85.     public void setWaitTime(long waitTime) {  
  86.         this.waitTime = waitTime;  
  87.     }  
  88.   
  89.     public void setIncrementalConnections(int incrementalConnections) {  
  90.         this.incrementalConnections = incrementalConnections;  
  91.     }  
  92.   
  93.     public int getIncrementalConnections() {  
  94.         return incrementalConnections;  
  95.     }  
  96.   
  97. }  
RAGFlow 系列教程 第三课:后端服务入口与请求生命周期 本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。 阅读详情

相关推荐

ROC-RK3588S-PC 刷机 安装Android系统

rk3588刷机,装系统

Wjz_www的博客 4834

后端学习(二)实现自己的数据库连接池

本文将介绍一个简易的数据库连接池,来便于理解其原理。

iii_ooo的博客 2563

yolov7模型部署流程

yolov7部署流程

算法的猫 1396

JDBC连接池&JDBCTemplate课堂笔记

今日内容 1. 数据库连接池 2. Spring JDBC : JDBC Template 数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。 2. 好处: 1. 节约资源 2. 用户访...

qq_38313060的博客 2257

python爬虫入门教程(非常详细)

爬虫指的是一种自动化程序,能够模拟人类在互联网上的浏览行为,自动从互联网上抓取、预处理并保存所需要的信息。爬虫运行的过程一般是先制定规则(如指定要抓取的网址、要抓取的信息的类型等),紧接着获取该网址的HTML源代码,根据规则对源代码进行解析和抽取,最后进行处理和保存。爬虫在实际应用中广泛使用,如搜索引擎、大数据分析、交易数据采集等领域,都需要用到爬虫技术来实现信息的定向采集和处理。

工宗浩生财指南针 2万+

微调BERT进行中文文本分类任务(Pytorch代码实现)

BERT(Bidirectional Encoder Representation from Transformers)是2018年10月由Google AI研究院提出的一种预训练模型。其模型结构由多层Transformer的Encoder堆叠而成,在大规模语料中进行预训练后,迁移到下游任务,仅进行参数微调训练,就能显著提升性能。本文聚焦于微调中文BERT进行新闻标题分类任务的代码实现。

Iswayzw的博客 1万+

连接池的三种实现方式

关于连接池:关于数据库的连接过程,我们经常用到的是JDBC技术,一般对于初学者来说都是通过定义一个连接方法和一个释放资源的方法,可是这样的方式存在一个弊端,就是当连接数非常多的时候,我们不断使用连接和关闭,这样比较消耗系统资源,这时候我们就需要引入连接池。 关于连接池的思想是,我们先创建一个池子,之后创建连接存放到池子中去,这时候我们再从池子中直接通过拿取连接来进行使用,使用完之后再归还给池子即...

huolan52的博客 3724

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 285

【server组件】——mysql连接池的实现原理

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成 一个连接池,由程序动态地对池中的连接进行 申请,使用,释放。

sjp11的博客 995

智能运营模型的建设与运用实践

一项运营活动的全流程,主要包含客群挖掘与筛选、产品与权益选择、触点与活动选择、运营策略调优等关键环节,涉及客群管理、活动管理、权益管理、触达管理、智能调控等系统支撑需求,如今工商银行已开展与其相对应的推荐模型、分析模型等的研发与实践。自2023年9月该模型被知客运营平台吸收并上线以来,已累计有远程银行中心、吉林分行、重庆分行等30余家分行或机构使用,赋能融e借、积存金、结售汇、基金、理财、存款等12种场景,产生营销客户清单达千万人次,有力促进了保守型理财、天天盈、添益快线、寿险等产品的销售。

银行信息系统应用架构详解 849

AD22里面封装修改后,同步到PCB图里面

【摘要】本文介绍了Altium Designer 22中同步更新元件封装的三种方法:1)从PCB库直接更新:在PCB库面板右键选择"Update PCB With[封装名]";2)通过原理图标准更新:使用Design->Update PCB Document菜单;3)在PCB编辑器中验证更新:通过Tools->Update From PCB Libraries菜单。所有方法最终都需通过ECO(工程变更订单)确认变更,建议执行前仔细核对变更内容。这些方法适用于AD22及早期版本

whm128的博客 1758

数据库连接池的设计与实现:提高数据库访问性能

在使用数据库连接池时,应遵循一定的步骤来获取连接、使用连接和释放连接,以确保连接的有效和高效使用。使用数据库连接池可以大大减少连接的创建和销毁开销,提高数据库访问性能,同时也可以更好地管理数据库资源。数据库连接池是在应用程序和数据库之间建立的一组预先创建的数据库连接。在实际开发中,选择适合自己编程语言和数据库的连接池实现,根据需求和性能进行适当的调整和优化。连接池将负责管理连接的分配和回收,以确保连接的有效和高效使用。在实现数据库连接池时,需要考虑一些重要的配置参数,以满足应用程序的需求和数据库的性能。

m0_75198698的博客 472

Pdu Router(PduR)模块

1. PduR路由基本功能 2. PduR总线网关功能 3. PduR缓存机制 4. 总结

weixin_43759043的博客 3849

java数据库连接池代码实现

连接池原理已经解释了,下面该看看代码是如何实现的吧     数据库连接池有很多,我就不一一列举了,有 dbcp,c3p0, Proxool,BoneCP,Druid............强迫症可以自己去百度,然后背下来 简单介绍一下, DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使

qq_14926283的博客 2107

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC下的ADO连接池

由于工作需要,查找了很多关于数据库连接池的实现代码.但是发现很多都是JAVA  版本的.我试着改了一下,代码如下:/********************************************************************  ADO 对象的简单封装*************************************************************

xiaoly_caep的专栏 4997

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何编写出高效的数据库连接池(附带完整代码C#和Java实现) (转)

如何编写出高效的数据库连接池(附带完整代码C#和Java实现)  相关技术: 连接池 引用记数 多线程 Timer类运行基理 C#.Net Java 适宜人群 数据库应用程序程序员 系统分析员 模块设计师 有一定功底的程序员 目

Welcome to Eric Zhang's blog 1039

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java 数据库连接池的实现代码

google_ad_client = "pub-8432098110340913";/* 250x250, office2007_内容区左上广告,创建于 08-2-13 */google_ad_slot = "3493930840";google_ad_width = 250;google_ad_height = 250;//--> Tags:[java]  [jdb

巴士飞扬-busfly.cn-的专栏 684

(转)java 数据库连接池的实现代码

java 数据库连接池的实现代码 package com.xiaobian;       /**    * 数据库连接池管理类    */   import java.io.*;    import java.sql.*;    import java.util.*;    import java.util.Date;     ...

Xinghaiguzhou的专栏 179

java实现简单的连接池,Java实现简单的数据库连接池代码

package org.apple.connectionpool;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Collections;import java.util.Date;imp...

weixin_29035147的博客 427

java数据库连接池原理,代码实现

数据库连接池根据原理简单实现代码,看看代码就懂了

qq_14926283的博客 472

关于eclipse数据库连接池封装使用

创建一个文件,在src目录下,文件名为&quot;db.properties&quot; 文件中以键值对形式记录,地址(url),数据库名(username),数据库密码(username) 连接池最大数(MaxPoolSize),连接池最小数(MinPoolSize),初始化连接池连接数量( initialPoolSize),当连接池用完时客户端调用getConnection()后等待获取新连接的时间 ,超时后...

__盛某人的博客 719

单例模式——数据库连接池设计Java代码实现

使用getInstance()方法来获取这个实例。在getInstance()方法中,如果instance为空,则创建一个新的DatabaseConnectionPool实例。在getConnection()方法中,从连接池中获取一个连接(如果池为空,则创建一个新连接),并将其返回给调用方。请注意,例子中在getInstance()方法和getConnection()方法中使用了synchronized关键字,以确保线程安全。init()方法用于初始化连接池,其中创建了10个连接并将其添加到连接池中。

DKPT的博客 1039

【Java面试题】数据库连接池Java代码实现

今天复习一下数据库连接池的实现 代码 /** * 自定义连接池, 管理连接 * 代码实现: 1. MyPool.java 连接池类, 2. 指定全局参数: 初始化数目、最大连接数、当前连接、 连接池集合 3. 构造函数:循环创建3个连接 4. 写一个创建连接的方法 5. 获取连接 ------> 判断: 池中有连接, 直接拿 ---

zjkC050818的博客 2364

Java c3p0 oracle 数据库连接池 代码实现 (一)

<br />编译及运行环境:winxp+jdk5.0+eclipse3.2+oracle9i<br /> 所需jar包:<br />     oracle9.jar(oralce驱动器)<br />     c3p0-0.9.1.2.jar<br />     log4j-1.2.8.jar<br />     commons-logging.jar<br /><br /> SystemConfigResources.properties<br /> #oracle config<br

IOT之无线网络传输技术 4768

实现高效的数据库连接池(附带完整代码C#和Java实现)

http://blog.youkuaiyun.com/ta8210/article/details/1582162 相关技术: 连接池 引用记数 多线程 C#.Net Java 目录 引言 数据库连接池(Connection Pool)的工作原理 连接池关键问题分析 并发问题 事务处理 连接池的分配与释放 连接池的配置与维护 关键议题 引用记数 如

Quincylk的专栏 1万+

DBCP数据库连接池

DBCP 一、前言 DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。 二、DBCP使用 2.1、前期准备 2.1.1、添加依赖 &amp;lt;!--JDBC--&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupI...

YIMT的博客 258
上一篇: 转: 用”堆栈区数据复制”理解Java赋值和参数传递机制的心得
下一篇: 学习一下org.apache.commons.digester.Digester
GetStudyMessages
博客等级 码龄17年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值