连接池的好处(C0P3测试)

来源:互联网 发布:cad制图软件 编辑:程序博客网 时间:2024/04/30 09:59
  连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
  这种把连接“汇集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC 连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。
  事实上,当一个线程需要用 JDBC 对一个 GBase 或其它数据库操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。
  当连接从池中“借出”,它被请求它的线程专有地使用。从编程的角度来看,这和用户的线程每当需要一个 JDBC 连接的时候调用DriverManager.getConnection() 是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。
  连接池可以极大的改善用户的 Java 应用程序的性能,同时减少全部资源的使用。连接池主要的优点有:
  减少连接创建时间
  虽然与其它数据库相比 GBase 提供了较为快速连接功能,但是创建新的 JDBC 连接仍会招致网络和 JDBC 驱动的开销。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。
  简化的编程模式
  当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC编程技术。
  受控的资源使用
  如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并且可能会导致高负载下的异常发生。
  注意,每个连到 GBase 的连接在客户端和服务器端都有花销(内存,CPU,上下文切换等等)。每个连接均会对应用程序和 GBase 服务器的可用资源带来一定的限制。不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。

  连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

 

 

C3P0连接管理器

 

package cn.c3p0;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public final class ConnectionManager {    private static ConnectionManager instance;    private static ComboPooledDataSource dataSource;    private ConnectionManager() throws SQLException, PropertyVetoException {        dataSource = new ComboPooledDataSource();        dataSource.setUser("hai");        dataSource.setPassword("1223");        dataSource.setJdbcUrl("jdbc:oracle:thin:@192.168.10.38:1521:ztsys");        dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");        dataSource.setInitialPoolSize(5);        dataSource.setMinPoolSize(1);        dataSource.setMaxPoolSize(10);        dataSource.setMaxStatements(50);        dataSource.setMaxIdleTime(60);    }    public static final ConnectionManager getInstance() {        if (instance == null) {            try {                instance = new ConnectionManager();            } catch (Exception e) {                e.printStackTrace();            }        }        return instance;    }    public synchronized final Connection getConnection() {        Connection conn = null;        try {            conn = dataSource.getConnection();        } catch (SQLException e) {            e.printStackTrace();        }        return conn;    }}


 

 

测试例子:

package cn.c3p0;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import oracle.jdbc.pool.OracleDataSource;public class ConnectionDemo {    public static void main(String[] args) throws SQLException {        System.out.println("使用连接池................................");        for (int i = 0; i < 20; i++) {            long beginTime = System.currentTimeMillis();            Connection conn = ConnectionManager.getInstance().getConnection();            try {                PreparedStatement pstmt = conn.prepareStatement("select * from event t");                ResultSet rs = pstmt.executeQuery();                while (rs.next()) {                 // do nothing...                }            } catch (SQLException e) {                e.printStackTrace();            } finally {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            long endTime = System.currentTimeMillis();            System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));        }        System.out.println("不使用连接池................................");        for (int i = 0; i < 20; i++) {            long beginTime = System.currentTimeMillis();            OracleDataSource ods = new OracleDataSource();            ods.setUser("hai");            ods.setPassword("1223");            ods.setURL("jdbc:oracle:thin:@192.168.10.38:1521:ztsys");            Connection conn = ods.getConnection();            try {                PreparedStatement pstmt = conn.prepareStatement("select * from event t");                ResultSet rs = pstmt.executeQuery();                while (rs.next()) {                                    // do nothing...                }            } catch (SQLException e) {                e.printStackTrace();            } finally {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            long endTime = System.currentTimeMillis();            System.out.println("第" + (i + 1) + "次执行花费时间为:"                                + (endTime - beginTime));        }    }}


测试结果:

使用连接池................................
2011-8-23 14:23:10 com.mchange.v2.log.MLog <clinit>
信息: MLog clients using java 1.4+ standard logging.
2011-8-23 14:23:10 com.mchange.v2.c3p0.C3P0Registry banner
信息: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
2011-8-23 14:23:10 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge3728h1w2au7f1c496sy|6e293a, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> oracle.jdbc.driver.OracleDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge3728h1w2au7f1c496sy|6e293a, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:oracle:thin:@192.168.10.38:1521:ztsys, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 60, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 1, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
第1次执行花费时间为:1031
第2次执行花费时间为:172
第3次执行花费时间为:266
第4次执行花费时间为:156
第5次执行花费时间为:172
第6次执行花费时间为:156
第7次执行花费时间为:172
第8次执行花费时间为:141
第9次执行花费时间为:156
第10次执行花费时间为:172
第11次执行花费时间为:172
第12次执行花费时间为:156
第13次执行花费时间为:172
第14次执行花费时间为:172
第15次执行花费时间为:172
第16次执行花费时间为:171
第17次执行花费时间为:157
第18次执行花费时间为:156
第19次执行花费时间为:187
第20次执行花费时间为:157
不使用连接池................................
第1次执行花费时间为:187
第2次执行花费时间为:188
第3次执行花费时间为:187
第4次执行花费时间为:188
第5次执行花费时间为:187
第6次执行花费时间为:203
第7次执行花费时间为:188
第8次执行花费时间为:187
第9次执行花费时间为:188
第10次执行花费时间为:203
第11次执行花费时间为:203
第12次执行花费时间为:281
第13次执行花费时间为:188
第14次执行花费时间为:219
第15次执行花费时间为:203
第16次执行花费时间为:203
第17次执行花费时间为:187
第18次执行花费时间为:219
第19次执行花费时间为:219
第20次执行花费时间为:203

原创粉丝点击