连接池的好处(C0P3测试)

  连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
  这种把连接“汇集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问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

### 基于单片机的泳池水温水位测控系统设计方案 #### 系统概述 基于单片机的泳池水温水位测控系统的实现涉及硬件电路设计、传感器选型以及软件编程等多个方面。该系统的主要功能是对泳池中的水温和水位进行实时监测,并通过控制设备调节至设定范围。 --- #### 硬件部分设计 1. **核心控制器** 单片机作为整个系统的控制中心,负责接收来自传感器的数据并执行相应的逻辑运算和控制操作。常用的单片机型号有STC89系列、STM32系列等[^1]。 2. **温度检测模块** 温度测量通常采用热敏电阻或数字式温度传感器DS18B20。其中,DS18B20因其高精度、易集成的特点被广泛应用于此类场景中[^2]。 3. **水位检测模块** 水位检测可以利用浮球开关或者超声波距离传感器来完成。对于精确度要求较高的场合,推荐使用超声波传感器HC-SR04来进行液面高度测定[^3]。 4. **显示单元** LCD显示屏能够直观地向用户展示当前水温和水位状态信息。常见的字符型LCD1602/2004满足基本需求即可[^4]。 5. **报警与调控装置** 当实际参数超出预设阈值时触发警报提示;同时可通过继电器驱动加热棒调整水温,开启排水泵降低过高水位等方式维持正常运行条件[^5]。 --- #### 软件程序开发 以下是简化版主循环流程伪代码示例: ```c #include <reg52.h> //假设选用的是51单片机头文件 sbit DS18B20_PIN = P3^7; //定义端口连接关系 float tempValue; int waterLevel; void readTemperature() { //读取DS18B20数据方法省略... } void measureWaterLevel() { //调用HC-SR04获取厘米级数值算法忽略.. } void main(){ while(1){ readTemperature(); //采集环境温度 measureWaterLevel(); //评估水面位置 if(tempValue<lowerLimit || tempValue>upperLimit ){ soundAlarm(); } updateDisplay(tempValue,waterLevel); } } ``` 上述片段仅作示意用途,在具体项目实施过程中还需要考虑更多细节处理如抗干扰措施、电源管理策略等方面的内容[^6]。 --- #### 注意事项 - 在选购元器件之前应充分了解其工作电压电流规格是否匹配目标平台供电能力; - 编写固件前最好先搭建仿真模型验证思路可行性再移植到实物上测试效果; - 安全防护不可忽视,比如防止短路烧毁元件等问题发生。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值