数据库连接池
获取空闲的数据库连接

DRUID是阿里巴巴开源平台上一个数据库连接池实现,代码如下
mysql mysql-connector-java 8.0.31
com.alibaba druid 1.2.15
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;public class Hello {public static void main(String[] args) throws SQLException {//TODO 1 创建数据库连接池DruidDataSource d = new DruidDataSource();//TODO 2 设置MySQL基本连接参数d.setDriverClassName("com.mysql.cj.jdbc.Driver"); //驱动全类名d.setUrl("jdbc:mysql://localhost:3306"); //JDBC的URLd.setUsername("root"); //数据库用户名d.setPassword("123456"); //数据库密码//TODO 3 设置缓冲池参数d.setInitialSize(1); //初始化时的连接数d.setMaxActive(2); //同时活跃的最大连接数d.setMinIdle(1); //空闲时的最小连接数d.setMaxWait(3000L); //用户等待最大毫秒数//TODO 4 访问数据库DruidPooledConnection c = d.getConnection();//用于执行静态SQL并返回结果的对象Statement s = c.createStatement();//执行SQL(默认情况下,每个Statement对象只能同时打开一个ResultSet对象)ResultSet r = s.executeQuery("SELECT 8 AS a,'x' AS b UNION ALL SELECT 9 AS a,'y' AS b");//获取元数据ResultSetMetaData m = r.getMetaData();System.out.println(m.getColumnName(1) + "\t" + m.getColumnName(2));//获取数据while (r.next()) {System.out.println(r.getInt(1) + "\t" + r.getString(2));}//释放ResultSet,释放Statement,归还数据库连接r.close();s.close();c.close();//TODO 5 连接数测试(new MyThread()).start();for (int i = 0; i < 3; i++) {d.getConnection();} //上面设置了最大连接数2,第3个连接超时3秒后报错}static class MyThread extends Thread {@Overridepublic void run() {for (int i = 1; i < 5; i++) {try {Thread.sleep(999L);System.out.println("过了" + i + "秒");} catch (InterruptedException e) {e.printStackTrace();}}}}
}
代码运行结果打印
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;public class DatabaseConnectionPool {private final DruidDataSource druidDataSource;public DatabaseConnectionPool() {druidDataSource = new DruidDataSource();//始化时的连接数量druidDataSource.setInitialSize(5);//同时活跃的最大连接数druidDataSource.setMaxActive(20);//空闲时的最小连接数druidDataSource.setMinIdle(1);//获取连接等待的最大毫秒数,超时抛出异常,设-1表示一直等待druidDataSource.setMaxWait(-1L);//借出连接时 是否测试,false不测试 提升性能druidDataSource.setTestOnBorrow(false);//归还连接时 是否测试druidDataSource.setTestOnReturn(false);//每隔30秒运行一次 空闲连接回收器druidDataSource.setTimeBetweenEvictionRunsMillis(30 * 1000L);//池中 空闲30分钟的连接将被回收druidDataSource.setMinEvictableIdleTimeMillis(30 * 60 * 1000L);}public void setDBCP(String driverClass, String jdbcUrl) {druidDataSource.setDriverClassName(driverClass);druidDataSource.setUrl(jdbcUrl);}public void setDBCP(String driverClass, String jdbcUrl, String user, String pwd) {setDBCP(driverClass, jdbcUrl);druidDataSource.setUsername(user);druidDataSource.setPassword(pwd);}public void selectPrint(String sql) throws SQLException {DruidPooledConnection c = druidDataSource.getConnection();//获取 用于执行静态SQL并返回结果的对象Statement s = c.createStatement();//执行SQL(默认情况下,每个Statement对象只能同时打开一个ResultSet对象)ResultSet r = s.executeQuery(sql);//获取元数据ResultSetMetaData m = r.getMetaData();//获取列数int columnCount = m.getColumnCount();//打印列名System.out.print("行号");for (int i = 1; i <= columnCount; i++) {System.out.print("\t|\t" + m.getColumnName(i));}System.out.println();//打印数据while (r.next()) {System.out.print(r.getRow());for (int i = 1; i <= columnCount; i++) {System.out.print("\t|\t" + r.getObject(i));}System.out.println();}//释放ResultSet,释放Statement,归还数据库连接r.close();s.close();c.close();}public static void main(String[] args) throws SQLException {//测试DatabaseConnectionPool d = new DatabaseConnectionPool();d.setDBCP("com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306", "root", "123456");d.selectPrint("SELECT 8 AS a,'x' AS b UNION ALL SELECT 9 AS a,'y' AS b");}
}
上一篇:集群配置步骤_java培训
下一篇:《找对英语学习方法的第一本书》