主要用到的是ReentrantLock锁,还有 notEmpty empty两个条件, 生产连接与消费连接的 线程在两个条件上等待与唤醒。 empty还是生产者,notEmpty是消费者。
主要 DruidAbstractDataSource与DruidDataSource两个类了。
创建连接 DruidDataSource里的CreateConnectionThread,连接太多了的时候,在empty条件上等待,就是等空了再运行,现在别急着创建连接,等着吧!
connection = createPhysicalConnection(); 创建一个物理连接。然后put一下,这个put很可能是放池子中,
使用连接DruidDataSource 的getConnectionInternal的takeLast()方法从池子里面获取连接。getConnectionInternal方法还会直接创建一个物理连接createPhysicalConnection()
谁在用takeLast(),查找发现是getPooledConnection()–getConnection(maxWait)—getConnectionDirect(maxWaitMillis)–getConnectionInternal(maxWaitMillis)
getConnection(),这里面又是插入了过滤链,果然是为统计而生,都记录在案了。
减少连接 在创建连接线程附近还有一个DestroyConnectionThread()有destroyTask.run();—–>shrink(true);看名字是收缩嘛,可能连接空闲的太多了,就缩小呗。
初始化方法init()
一个创建的线程,一个清理的线程,一个获取连接的线程,3个线程公用一把锁。
public class AA {
public static DataSource getDataSource1() throws Exception{
DruidDataSource dataSource1 = new DruidDataSource();
dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
dataSource1.setUrl("jdbc:mysql://127.0.0.1:3306/account?useUnicode=true&characterEncoding=utf-8&useSSL=false");
dataSource1.setUsername("root");
dataSource1.setPassword("123456");
// dataSource1.addFilters("stat");
return dataSource1;
}
public static void main(String[] args) throws SQLException, Exception {
final String sql = "select * from money";
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Connection conn = getDataSource1().getConnection();
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement ele : stackTrace) {
System.out.println(ele);
}
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet re = preparedStatement.executeQuery();
while(re.next()) {
System.out.println(re.getDouble("money"));
System.out.println(re.getString("name"));
System.out.println(re.getInt("id"));
}
preparedStatement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}, "get()线程" + (i+1)).start();
}
}
}
Original: https://www.cnblogs.com/yaowen/p/12373501.html
Author: 哈哈呵h
Title: druid
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545908/
转载文章受原作者版权保护。转载请注明原作者出处!