java数据库连接池最大连接数最小连接数怎么设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据库连接池最大连接数最小连接数怎么设置相关的知识,希望对你有一定的参考价值。

最大连接数:这个连接池最多能有几条连接,如果初始化的连接数没有了,用户可以创建,但是要给个判断不能超过最大连接数。
最小连接数:就是连接池初始化的连接(连接池初始化多少条连接)

// 设置最大连接数,(根据并发请求合理设置)。
config.setMaxTotal(100);
// 设置最大空闲连接数,(根据并发请求合理设置)
config.setMaxIdle(20);
// 多长空闲时间之后回收空闲连接
setMinEvictableIdleTimeMillis(60000);
// 设置最小空闲连接数或者说初始化连接数
config.setMinIdle(10);
// 设置最大等待时间
config.setMaxWaitMillis(500);
// 跟验证有关
config.setTestOnBorrow(true);
// 跟验证有关
config.setTestOnReturn(false);
// 启动空闲连接的测试
config.setTestWhileIdle(false);
参考技术A apache的DBCP,可以通过配置文件修改。
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/database
username=root
password=password

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

数据库连接池简要实现

数据库连接池

数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:

  • 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.

  • 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作

  • 如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放.

实现DataSource接口,并实现连接池功能的步骤:

  • 在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。

  • 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。

  • 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。

连接池示例

 
   
   
 
  1. import java.io.InputStream;

  2. import java.io.PrintWriter;

  3. import java.lang.reflect.InvocationHandler;

  4. import java.lang.reflect.Method;

  5. import java.lang.reflect.Proxy;

  6. import java.sql.Connection;

  7. import java.sql.DriverManager;

  8. import java.sql.SQLException;

  9. import java.util.LinkedList;

  10. import java.util.Properties;

  11. import javax.sql.DataSource;

  12. public class JdbcPool implements DataSource {

  13.    private static LinkedList<Connection> listConnections=new LinkedList<Connection>();

  14.    static{

  15.        InputStream in=JdbcPool.class.getClassLoader().getResourceAsStream("db.properties");

  16.        Properties prop=new Properties();

  17.        try{

  18.            prop.load(in);

  19.            String driver=prop.getProperty("driver");

  20.            String url = prop.getProperty("url");

  21.            String username = prop.getProperty("username");

  22.            String password = prop.getProperty("password");

  23.            int jdbcPoolInitSize =Integer.parseInt(prop.getProperty("jdbcPoolInitSize"));

  24.             Class.forName(driver);

  25.             for (int i = 0; i < jdbcPoolInitSize; i++) {

  26.                 Connection conn = DriverManager.getConnection(url, username, password);

  27.                 System.out.println("获取到了链接" + conn);

  28.                 listConnections.add(conn);

  29.             }

  30.        }catch(Exception e){

  31.            throw new ExceptionInInitializerError(e);

  32.        }

  33.    }

  34.    @Override

  35.    public PrintWriter getLogWriter() throws SQLException {

  36.        // TODO Auto-generated method stub

  37.        return null;

  38.    }

  39.    @Override

  40.    public void setLogWriter(PrintWriter out) throws SQLException {

  41.        // TODO Auto-generated method stub

  42.    }

  43.    @Override

  44.    public void setLoginTimeout(int seconds) throws SQLException {

  45.        // TODO Auto-generated method stub

  46.    }

  47.    @Override

  48.    public int getLoginTimeout() throws SQLException {

  49.        // TODO Auto-generated method stub

  50.        return 0;

  51.    }

  52.    @Override

  53.    public <T> T unwrap(Class<T> iface) throws SQLException {

  54.        // TODO Auto-generated method stub

  55.        return null;

  56.    }

  57.    @Override

  58.    public boolean isWrapperFor(Class<?> iface) throws SQLException {

  59.        // TODO Auto-generated method stub

  60.        return false;

  61.    }

  62.    @Override

  63.    public Connection getConnection() throws SQLException {

  64.        // TODO Auto-generated method stub

  65.         if (listConnections.size()>0) {

  66.             final Connection conn = listConnections.removeFirst();

  67.             System.out.println("listConnections数据库连接池大小是" + listConnections.size());

  68.             return (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(), new Class[]{Connection.class}, new InvocationHandler(){

  69.                @Override

  70.                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

  71.                    // TODO Auto-generated method stub

  72.                    if(!method.getName().equals("close")){

  73.                        return method.invoke(conn, args);

  74.                    }else{

  75.                        listConnections.add(conn);

  76.                         System.out.println(conn + "被还给listConnections数据库连接池了!!");

  77.                         System.out.println("listConnections数据库连接池大小为" + listConnections.size());

  78.                         return null;

  79.                    }

  80.                }

  81.             });

  82.         }else{

  83.             throw new RuntimeException("对不起,数据库忙");

  84.         }

  85.    }

  86.    @Override

  87.    public Connection getConnection(String username, String password) throws SQLException {

  88.        // TODO Auto-generated method stub

  89.        return null;

  90.    }

  91. }

创建连接池

 
   
   
 
  1. import java.sql.Connection;

  2. import java.sql.ResultSet;

  3. import java.sql.SQLException;

  4. import java.sql.Statement;

  5. public class JdbcUtil {

  6.    private static JdbcPool pool = new JdbcPool();

  7.    public static Connection getConnection() throws SQLException {

  8.        return pool.getConnection();

  9.    }

  10.    public static void release(Connection conn, Statement st, ResultSet rs) {

  11.        if (rs != null) {

  12.            try {

  13.                // 关闭存储查询结果的ResultSet对象

  14.                rs.close();

  15.            } catch (Exception e) {

  16.                e.printStackTrace();

  17.            }

  18.            rs = null;

  19.        }

  20.        if (st != null) {

  21.            try {

  22.                // 关闭负责执行SQL命令的Statement对象

  23.                st.close();

  24.            } catch (Exception e) {

  25.                e.printStackTrace();

  26.            }

  27.        }

  28.        if (conn != null) {

  29.            try {

  30.                // 关闭Connection数据库连接对象

  31.                conn.close();

  32.            } catch (Exception e) {

  33.                e.printStackTrace();

  34.            }

  35.        }

  36.    }

  37. }


以上是关于java数据库连接池最大连接数最小连接数怎么设置的主要内容,如果未能解决你的问题,请参考以下文章

was连接池怎么看

数据库连接池简要实现

数据库连接池

如何在java里获取hibernate连接池最大连接数和当前连接数

mysql最大连接数设置多少合适

怎样设置TCP的连接数