/* * Copyright 1999-2017 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.druid.pool.ui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.management.ManagementFactory; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.NumberFormat; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import javax.management.ObjectName; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SpringLayout; import com.alibaba.druid.TestUtil; import com.alibaba.druid.pool.DruidDataSource; public class DruidDataSourceUIManager extends JFrame { private static final long serialVersionUID = 1L; private DruidDataSource dataSource; private SpringLayout layout = new SpringLayout(); private JButton btnInitDataSource = new JButton("Init Pool"); private JButton btnCloseDataSource = new JButton("Close Pool"); private JButton btnConnect = new JButton("Get Connection"); private JButton btnClose = new JButton("Close Connection"); private JButton btnCase_0 = new JButton("Case 0"); private JPanel mainPanel = new JPanel(); private JScrollPane scrollPane = new JScrollPane(mainPanel); private JLabel lbUrl = new JLabel("URL : "); private JTextField txtUrl = new JTextField( "jdbc:oracle:thin:@a.b.c.d:1521:ocndb"); private JLabel lbDriverClass = new JLabel("DriverClassName : "); private JTextField txtDriverClass = new JTextField(); private JLabel lbUser = new JLabel("User : "); private JTextField txtUser = new JTextField(); private JLabel lbPassword = new JLabel("Password : "); private JTextField txtPassword = new JTextField(); private JLabel lbConnectionProperties = new JLabel( "Connection Properties : "); private JTextField txtConnectionProperties = new JTextField(); private JLabel lbInitialSize = new JLabel("InitialSize : "); private JTextField txtInitialSize = new JTextField("1"); private JLabel lbMaxActive = new JLabel("MaxActive : "); private JTextField txtMaxActive = new JTextField("14"); private JLabel lbMaxIdle = new JLabel("MaxIdle : "); private JTextField txtMaxIdle = new JTextField("14"); private JLabel lbMinIdle = new JLabel("MinIdle : "); private JTextField txtMinIdle = new JTextField("1"); private JLabel lbMaxWait = new JLabel("MaxWait : "); private JTextField txtMaxWait = new JTextField("-1"); private JLabel lbMinEvictableIdleTimeMillis = new JLabel( "MinEvictableIdleTimeMillis : "); private JTextField txtMinEvictableIdleTimeMillis = new JTextField("1800000"); private DruidDataStatusPanel statusPanel = new DruidDataStatusPanel(); private JLabel lbValidationQuery = new JLabel("ValidationQuery : "); private JTextField txtValidationQuery = new JTextField(""); private JLabel lbTestWhileIdle = new JLabel("TestWhileIdle : "); private JTextField txtTestWhileIdle = new JTextField("false"); private JLabel lbTestOnBorrow = new JLabel("TestOnBorrow : "); private JTextField txtTestOnBorrow = new JTextField("false"); private JTextField txtGetStep = new JTextField("1"); private JTextField txtReleaseStep = new JTextField("1"); private AtomicInteger connectingCount = new AtomicInteger(); private AtomicInteger connectCount = new AtomicInteger(); private AtomicInteger closeCount = new AtomicInteger(); private AtomicInteger executingCount = new AtomicInteger(); private Thread statusThread; private final ConcurrentLinkedQueue<Connection> activeConnections = new ConcurrentLinkedQueue<Connection>(); private ExecutorService executor; public DruidDataSourceUIManager(){ this.setLayout(new BorderLayout()); Toolkit kit = Toolkit.getDefaultToolkit(); // 定义工具包 Dimension screenSize = kit.getScreenSize(); // 获取屏幕的尺寸 int screenWidth = screenSize.width / 2; // 获取屏幕的宽 int screenHeight = screenSize.height / 2; // 获取屏幕的高 int height = this.getHeight(); int width = this.getWidth(); setLocation(screenWidth - width / 2, screenHeight - height / 2); this.getContentPane().add(scrollPane, BorderLayout.CENTER); mainPanel.setLayout(layout); mainPanel.add(lbUrl); layout.putConstraint(SpringLayout.NORTH, lbUrl, 10, SpringLayout.NORTH, mainPanel); layout.putConstraint(SpringLayout.WEST, lbUrl, 10, SpringLayout.WEST, mainPanel); layout.putConstraint(SpringLayout.EAST, lbUrl, 200, SpringLayout.WEST, lbUrl); mainPanel.add(txtUrl); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtUrl, 0, SpringLayout.VERTICAL_CENTER, lbUrl); layout.putConstraint(SpringLayout.WEST, txtUrl, 10, SpringLayout.EAST, lbUrl); layout.putConstraint(SpringLayout.EAST, txtUrl, -10, SpringLayout.EAST, mainPanel); // //// mainPanel.add(lbDriverClass); layout.putConstraint(SpringLayout.NORTH, lbDriverClass, 10, SpringLayout.SOUTH, lbUrl); layout.putConstraint(SpringLayout.WEST, lbDriverClass, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbDriverClass, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtDriverClass); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtDriverClass, 0, SpringLayout.VERTICAL_CENTER, lbDriverClass); layout.putConstraint(SpringLayout.WEST, txtDriverClass, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtDriverClass, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbUser); layout.putConstraint(SpringLayout.NORTH, lbUser, 10, SpringLayout.SOUTH, lbDriverClass); layout.putConstraint(SpringLayout.WEST, lbUser, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbUser, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtUser); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtUser, 0, SpringLayout.VERTICAL_CENTER, lbUser); layout.putConstraint(SpringLayout.WEST, txtUser, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtUser, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbPassword); layout.putConstraint(SpringLayout.NORTH, lbPassword, 10, SpringLayout.SOUTH, lbUser); layout.putConstraint(SpringLayout.WEST, lbPassword, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbPassword, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtPassword); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtPassword, 0, SpringLayout.VERTICAL_CENTER, lbPassword); layout.putConstraint(SpringLayout.WEST, txtPassword, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtPassword, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbConnectionProperties); layout.putConstraint(SpringLayout.NORTH, lbConnectionProperties, 10, SpringLayout.SOUTH, lbPassword); layout.putConstraint(SpringLayout.WEST, lbConnectionProperties, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbConnectionProperties, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtConnectionProperties); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtConnectionProperties, 0, SpringLayout.VERTICAL_CENTER, lbConnectionProperties); layout.putConstraint(SpringLayout.WEST, txtConnectionProperties, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtConnectionProperties, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbInitialSize); layout.putConstraint(SpringLayout.NORTH, lbInitialSize, 10, SpringLayout.SOUTH, lbConnectionProperties); layout.putConstraint(SpringLayout.WEST, lbInitialSize, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbInitialSize, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtInitialSize); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtInitialSize, 0, SpringLayout.VERTICAL_CENTER, lbInitialSize); layout.putConstraint(SpringLayout.WEST, txtInitialSize, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtInitialSize, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbMaxActive); layout.putConstraint(SpringLayout.NORTH, lbMaxActive, 10, SpringLayout.SOUTH, lbInitialSize); layout.putConstraint(SpringLayout.WEST, lbMaxActive, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbMaxActive, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtMaxActive); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtMaxActive, 0, SpringLayout.VERTICAL_CENTER, lbMaxActive); layout.putConstraint(SpringLayout.WEST, txtMaxActive, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtMaxActive, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbMaxIdle); layout.putConstraint(SpringLayout.NORTH, lbMaxIdle, 10, SpringLayout.SOUTH, lbMaxActive); layout.putConstraint(SpringLayout.WEST, lbMaxIdle, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbMaxIdle, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtMaxIdle); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtMaxIdle, 0, SpringLayout.VERTICAL_CENTER, lbMaxIdle); layout.putConstraint(SpringLayout.WEST, txtMaxIdle, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtMaxIdle, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbMinIdle); layout.putConstraint(SpringLayout.NORTH, lbMinIdle, 10, SpringLayout.SOUTH, lbMaxIdle); layout.putConstraint(SpringLayout.WEST, lbMinIdle, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbMinIdle, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtMinIdle); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtMinIdle, 0, SpringLayout.VERTICAL_CENTER, lbMinIdle); layout.putConstraint(SpringLayout.WEST, txtMinIdle, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtMinIdle, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbMaxWait); layout.putConstraint(SpringLayout.NORTH, lbMaxWait, 10, SpringLayout.SOUTH, lbMinIdle); layout.putConstraint(SpringLayout.WEST, lbMaxWait, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbMaxWait, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtMaxWait); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtMaxWait, 0, SpringLayout.VERTICAL_CENTER, lbMaxWait); layout.putConstraint(SpringLayout.WEST, txtMaxWait, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtMaxWait, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbMinEvictableIdleTimeMillis); layout.putConstraint(SpringLayout.NORTH, lbMinEvictableIdleTimeMillis, 10, SpringLayout.SOUTH, lbMaxWait); layout.putConstraint(SpringLayout.WEST, lbMinEvictableIdleTimeMillis, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbMinEvictableIdleTimeMillis, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtMinEvictableIdleTimeMillis); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtMinEvictableIdleTimeMillis, 0, SpringLayout.VERTICAL_CENTER, lbMinEvictableIdleTimeMillis); layout.putConstraint(SpringLayout.WEST, txtMinEvictableIdleTimeMillis, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtMinEvictableIdleTimeMillis, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbValidationQuery); layout.putConstraint(SpringLayout.NORTH, lbValidationQuery, 10, SpringLayout.SOUTH, lbMinEvictableIdleTimeMillis); layout.putConstraint(SpringLayout.WEST, lbValidationQuery, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbValidationQuery, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtValidationQuery); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtValidationQuery, 0, SpringLayout.VERTICAL_CENTER, lbValidationQuery); layout.putConstraint(SpringLayout.WEST, txtValidationQuery, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtValidationQuery, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(lbTestWhileIdle); layout.putConstraint(SpringLayout.NORTH, lbTestWhileIdle, 10, SpringLayout.SOUTH, lbValidationQuery); layout.putConstraint(SpringLayout.WEST, lbTestWhileIdle, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbTestWhileIdle, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtTestWhileIdle); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtTestWhileIdle, 0, SpringLayout.VERTICAL_CENTER, lbTestWhileIdle); layout.putConstraint(SpringLayout.WEST, txtTestWhileIdle, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtTestWhileIdle, 0, SpringLayout.EAST, txtUrl); mainPanel.add(lbTestOnBorrow); layout.putConstraint(SpringLayout.NORTH, lbTestOnBorrow, 10, SpringLayout.SOUTH, lbTestWhileIdle); layout.putConstraint(SpringLayout.WEST, lbTestOnBorrow, 0, SpringLayout.WEST, lbUrl); layout.putConstraint(SpringLayout.EAST, lbTestOnBorrow, 0, SpringLayout.EAST, lbUrl); mainPanel.add(txtTestOnBorrow); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtTestOnBorrow, 0, SpringLayout.VERTICAL_CENTER, lbTestOnBorrow); layout.putConstraint(SpringLayout.WEST, txtTestOnBorrow, 0, SpringLayout.WEST, txtUrl); layout.putConstraint(SpringLayout.EAST, txtTestOnBorrow, 0, SpringLayout.EAST, txtUrl); // //// mainPanel.add(btnInitDataSource); layout.putConstraint(SpringLayout.NORTH, btnInitDataSource, 10, SpringLayout.SOUTH, lbTestOnBorrow); layout.putConstraint(SpringLayout.WEST, btnInitDataSource, 0, SpringLayout.WEST, lbUrl); btnInitDataSource.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { init_actionPerformed(e); } }); mainPanel.add(btnCloseDataSource); layout.putConstraint(SpringLayout.VERTICAL_CENTER, btnCloseDataSource, 0, SpringLayout.VERTICAL_CENTER, btnInitDataSource); layout.putConstraint(SpringLayout.WEST, btnCloseDataSource, 10, SpringLayout.EAST, btnInitDataSource); btnCloseDataSource.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { closeDataSource_actionPerformed(e); } }); btnCloseDataSource.setEnabled(false); btnConnect.setEnabled(false); btnClose.setEnabled(false); btnCase_0.setEnabled(false); mainPanel.add(btnConnect); layout.putConstraint(SpringLayout.VERTICAL_CENTER, btnConnect, 0, SpringLayout.VERTICAL_CENTER, btnInitDataSource); layout.putConstraint(SpringLayout.WEST, btnConnect, 10, SpringLayout.EAST, btnCloseDataSource); btnConnect.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { connect_actionPerformed(e); } }); mainPanel.add(txtGetStep); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtGetStep, 0, SpringLayout.VERTICAL_CENTER, btnInitDataSource); layout.putConstraint(SpringLayout.WEST, txtGetStep, 10, SpringLayout.EAST, btnConnect); layout.putConstraint(SpringLayout.EAST, txtGetStep, 40, SpringLayout.WEST, txtGetStep); // txtGetStep mainPanel.add(btnClose); layout.putConstraint(SpringLayout.VERTICAL_CENTER, btnClose, 0, SpringLayout.VERTICAL_CENTER, btnInitDataSource); layout.putConstraint(SpringLayout.WEST, btnClose, 10, SpringLayout.EAST, txtGetStep); btnClose.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int step = Integer.parseInt(txtReleaseStep.getText().trim()); for (int i = 0; i < step; ++i) { Connection conn = activeConnections.poll(); if (conn != null) { try { conn.close(); closeCount.incrementAndGet(); } catch (SQLException ex) { ex.printStackTrace(); } } else { // System.out.println("close connection is null"); } } } }); mainPanel.add(txtReleaseStep); layout.putConstraint(SpringLayout.VERTICAL_CENTER, txtReleaseStep, 0, SpringLayout.VERTICAL_CENTER, btnInitDataSource); layout.putConstraint(SpringLayout.WEST, txtReleaseStep, 10, SpringLayout.EAST, btnClose); layout.putConstraint(SpringLayout.EAST, txtReleaseStep, 40, SpringLayout.WEST, txtReleaseStep); mainPanel.add(btnCase_0); layout.putConstraint(SpringLayout.VERTICAL_CENTER, btnCase_0, 0, SpringLayout.VERTICAL_CENTER, txtReleaseStep); layout.putConstraint(SpringLayout.WEST, btnCase_0, 10, SpringLayout.EAST, txtReleaseStep); btnCase_0.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { case_0(); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); // txtReleaseStep mainPanel.add(statusPanel); layout.putConstraint(SpringLayout.NORTH, statusPanel, 10, SpringLayout.SOUTH, btnInitDataSource); layout.putConstraint(SpringLayout.SOUTH, statusPanel, 120, SpringLayout.NORTH, statusPanel); layout.putConstraint(SpringLayout.WEST, statusPanel, 0, SpringLayout.WEST, lbUrl); // layout.putConstraint(SpringLayout.EAST, txtMaxWait, 0, SpringLayout.EAST, mainPanel); // //// } public void connect_actionPerformed(ActionEvent e) { int step = Integer.parseInt(txtGetStep.getText().trim()); for (int i = 0; i < step; ++i) { final Runnable task = new Runnable() { public void run() { try { connectingCount.incrementAndGet(); Connection conn = dataSource.getConnection(); connectCount.incrementAndGet(); connectingCount.decrementAndGet(); if (conn == null) { System.out.println("get connection is null"); return; } executingCount.incrementAndGet(); try { Statement stmt = conn.createStatement(); stmt.setQueryTimeout(5); ResultSet rs = stmt.executeQuery("SELECT 1 FROM DUAL"); while (rs.next()) { rs.getObject(1); } Thread.sleep(1000 * 3); rs.close(); stmt.close(); } finally { executingCount.decrementAndGet(); } activeConnections.add(conn); } catch (Exception ex) { ex.printStackTrace(); } } }; executor.submit(task); } } public void closeDataSource_actionPerformed(ActionEvent e) { dataSource.close(); try { ManagementFactory.getPlatformMBeanServer().unregisterMBean(new ObjectName( "com.alibaba.druid:type=DruidDataSource")); } catch (Exception e1) { e1.printStackTrace(); } txtUrl.setEnabled(true); txtDriverClass.setEnabled(true); txtConnectionProperties.setEnabled(true); txtUser.setEnabled(true); txtPassword.setEnabled(true); txtInitialSize.setEnabled(true); txtMaxActive.setEnabled(true); txtMaxIdle.setEnabled(true); txtMinIdle.setEnabled(true); txtMaxWait.setEnabled(true); txtMinEvictableIdleTimeMillis.setEnabled(true); btnInitDataSource.setEnabled(true); btnCloseDataSource.setEnabled(false); btnConnect.setEnabled(false); btnClose.setEnabled(false); btnCase_0.setEnabled(false); statusThread.interrupt(); } public void init_actionPerformed(ActionEvent e) { try { dataSource = new DruidDataSource(); dataSource.setUrl(txtUrl.getText().trim()); dataSource.setDriverClassName(txtDriverClass.getText().trim()); dataSource.setConnectionProperties(txtConnectionProperties.getText().trim()); dataSource.setUsername(txtUser.getText().trim()); dataSource.setPassword(txtPassword.getText().trim()); dataSource.setInitialSize(Integer.parseInt(txtInitialSize.getText().trim())); dataSource.setMaxActive(Integer.parseInt(txtMaxActive.getText().trim())); dataSource.setMaxIdle(Integer.parseInt(txtMaxIdle.getText().trim())); dataSource.setMinIdle(Integer.parseInt(txtMinIdle.getText().trim())); dataSource.setMaxWait(Integer.parseInt(txtMaxWait.getText().trim())); dataSource.setMinEvictableIdleTimeMillis(Integer.parseInt(txtMinEvictableIdleTimeMillis.getText().trim())); dataSource.setTestWhileIdle(Boolean.parseBoolean(txtTestWhileIdle.getText().trim())); dataSource.setTestOnBorrow(Boolean.parseBoolean(txtTestOnBorrow.getText().trim())); dataSource.setTimeBetweenEvictionRunsMillis(60000); dataSource.setNumTestsPerEvictionRun(20); ManagementFactory.getPlatformMBeanServer().registerMBean(dataSource, new ObjectName( "com.alibaba.druid:type=DruidDataSource")); try { Connection conn = dataSource.getConnection(); connectCount.incrementAndGet(); conn.close(); closeCount.incrementAndGet(); } catch (Exception ex) { ex.printStackTrace(); } executor = Executors.newCachedThreadPool(); txtDriverClass.setText(dataSource.getDriverClassName()); txtMinEvictableIdleTimeMillis.setText(Long.toString(dataSource.getMinEvictableIdleTimeMillis())); txtUrl.setEnabled(false); txtDriverClass.setEnabled(false); txtConnectionProperties.setEnabled(false); txtUser.setEnabled(false); txtPassword.setEnabled(false); txtInitialSize.setEnabled(false); txtMaxActive.setEnabled(false); txtMaxIdle.setEnabled(false); txtMinIdle.setEnabled(false); txtMaxWait.setEnabled(false); txtMinEvictableIdleTimeMillis.setEnabled(false); btnInitDataSource.setEnabled(false); btnCloseDataSource.setEnabled(true); btnConnect.setEnabled(true); btnClose.setEnabled(true); btnCase_0.setEnabled(true); statusThread = new Thread("Watch Status") { public void run() { for (;;) { statusPanel.set("CreateCount", dataSource.getCreateCount()); statusPanel.set("CreateErrorCount", dataSource.getCreateErrorCount()); statusPanel.set("CreateTimespanMillis", dataSource.getCreateTimespanMillis()); statusPanel.set("CreateTimespanNano", dataSource.getCreateTimespanNano()); statusPanel.set("DestroyCount", dataSource.getDestroyCount()); statusPanel.set("ConnectCount", dataSource.getConnectCount()); statusPanel.set("ConnectErrorCount", dataSource.getConnectErrorCount()); statusPanel.set("CloseCount", dataSource.getCloseCount()); statusPanel.set("RecycleCount", dataSource.getRecycleCount()); statusPanel.set("ActiveCount", dataSource.getActiveCount()); statusPanel.set("PoolingCount", dataSource.getPoolingCount()); statusPanel.set("UI_GettingCount", connectingCount.get()); statusPanel.set("UI_GetCount", connectCount.get()); statusPanel.set("UI_ReleaseCount", closeCount.get()); statusPanel.set("UI_ExecutingCount", executingCount.get()); try { Thread.sleep(100); } catch (InterruptedException e) { break; } } } }; statusThread.start(); } catch (Exception ex) { ex.printStackTrace(); } } public void case_0() throws Exception { Runnable task = new Runnable() { public void run() { final int threadCount = 20; final int LOOP_COUNT = 1000 * 1; final String sql = "SELECT 1 FROM DUAL"; final CountDownLatch startLatch = new CountDownLatch(1); final CountDownLatch endLatch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; ++i) { Thread thread = new Thread() { public void run() { try { startLatch.await(); for (int i = 0; i < LOOP_COUNT; ++i) { Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { rs.getInt(1); } rs.close(); stmt.close(); Thread.sleep(1); conn.close(); } } catch (Exception ex) { ex.printStackTrace(); } endLatch.countDown(); } }; thread.start(); } long startMillis = System.currentTimeMillis(); long startYGC = TestUtil.getYoungGC(); long startFullGC = TestUtil.getFullGC(); startLatch.countDown(); try { endLatch.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long millis = System.currentTimeMillis() - startMillis; long ygc = TestUtil.getYoungGC() - startYGC; long fullGC = TestUtil.getFullGC() - startFullGC; System.out.println("thread " + threadCount + " druid millis : " + NumberFormat.getInstance().format(millis) + ", YGC " + ygc + " FGC " + fullGC); } }; executor.submit(task); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { DruidDataSourceUIManager manager = new DruidDataSourceUIManager(); manager.pack(); manager.setSize(820, 580); int w = (Toolkit.getDefaultToolkit().getScreenSize().width - manager.getWidth()) / 2; int h = (Toolkit.getDefaultToolkit().getScreenSize().height - manager.getHeight()) / 2; manager.setLocation(w, h); manager.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); manager.setVisible(true); } }); } }