深入浅出数据库连接池c3p0

<div class="iteye-blog-content-contain" style="font-size: 14px;">
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">一、概述:</span></strong></p>
<p><span style="">     数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,c3p0有两种数据源管理方式,一种是通过程序变本身来进行管理,还有一种是通过容器管理,本节讨论通过程序本身来进行管理,下一节讨论通过容器进行管理。</span></p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">二、c3p0的三种实现方式</span></strong></p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">1、实现方式一:利用c3p0的API自己动手</span><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">写代码,实现数据源</span></strong></p>
<p><span style="">例如:在类路径下配置一个属性文件,config.properties,内容如下:</span></p>
<p> </p>
<pre name="code" class="java">driverClass=xxx
jdbcUrl=xxx
user=xxx
password=xxx</pre>
<p> </p>
<p> </p>
<p><span style="">相关的Java程序片段为:</span></p>
<p> </p>
<pre name="code" class="java">Properties props = new Properties();
InputStream in = Thread.class.getResourceAsStream("config.properties");
props.load(in);
in.close();

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(props.getProperty("driverClass"));
cpds.setJdbcUrl(props.getProperty("jdbcUrl"));
cpds.setUser(props.getProperty("user"));
cpds.setPassword(props.getProperty("password"));</pre>
<p> 这里只实现了一个数据源,也可以在类路径下配置一个xml文件,config.xml</p>
<p> </p>
<p> </p>
<pre name="code" class="xml"><config>
<source name="source1">
<property name="user">root</property>
<property name="password">xxx</property>
<property name="url">xxx</property>
<property name="driverClass">xxx</property>
</source>

<source name="source2">
...
</source>
</config></pre>
<p> <span style="">然后自己解析xml文件,这样可以实现多个数据源的配置</span></p>
<p> </p>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">2、实现方式二:</span><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">类路径下提供一个c3p0.properties文件,文件名必须为c3p0.properties</span></strong></p>
<p><span style="">配置如下:</span></p>
<p> </p>
<pre name="code" class="xml">#驱动
c3p0.driverClass=com.mysql.jdbc.Driver
#地址
c3p0.jdbcUrl=jdbc:mysql://d-shc-00426378/tools
#用户名
c3p0.user=root
#密码
c3p0.password=root</pre>
<p> <span style="">这里只提供了最基本的配置项,其他配置项参照 </span><a style="" href="http://www.mchange.com/projects/c3p0/index.html#c3p0-config.xml" target="_blank">文档</a><span style="">配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:</span></p>
<p> </p>
<p> </p>
<pre name="code" class="java">...
DataSource ds = new ComboPooledDataSource();
return ds;
...</pre>
<p> <span style="">然后就可以使用数据源了,C3P0会对c3p0.properties进行自动解析的。</span></p>
<p> </p>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">3、实现方式二:</span><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">类</span></strong><span style=""><strong>路径下提供一个c3p0-config.xml文件</strong> <br></span></p>
<p><span style="">这种方式与第二种差不多,但是有更多的优点 </span><br style=""><span style="">(1).更直观明显,很类似hibernate和spring的配置</span><br style=""><span style="">(2).可以为多个数据源服务,提供default-config和named-config两种配置方式 <br></span></p>
<p> </p>
<pre name="code" class="xml"><c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password">java</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>

<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>

<named-config name="mySource">
<property name="user">root</property>
<property name="password">java</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>

<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</named-config>
</c3p0-config></pre>
<p> </p>
<pre name="code" class="java">...
DataSource ds = new ComboPooledDataSource("mySource");
return ds;
...</pre>
<p> <span style=""><span style="">这样就可以使用数据源了。</span></span></p>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;"><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">三、实例,以第二种方式,即c3p0.propertis的方式为例说明</span></span></strong></p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;"><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">1、在classpath下创建一个文件,c3p0.properteis</span></span></strong></p>
<p> </p>
<pre name="code" class="xml">#驱动
c3p0.driverClass=com.mysql.jdbc.Driver
#地址
c3p0.jdbcUrl=jdbc:mysql://d-shc-00426378/tools
#用户名
c3p0.user=root
#密码
c3p0.password=root
#-------------------------------
#连接池初始化时创建的连接数
c3p0.initialPoolSize=3
#连接池保持的最小连接数
c3p0.minPoolSize=3
#连接池在无空闲连接可用时一次性创建的新数据库连接数,default:3
c3p0.acquireIncrement=3
#连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15
c3p0.maxPoolSize=15
#连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,单位秒
c3p0.maxIdleTime=100
#连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功
c3p0.acquireRetryAttempts=30
#连接池在获得新连接时的间隔时间
c3p0.acquireRetryDelay=1000</pre>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;"><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">2、封装一个C3p0ConnectionPool用来创建数据库连接</span></span></strong></p>
<p> </p>
<pre name="code" class="java">package com.wsheng.aggregator.c3p0;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
* @author Josh Wang(Sheng)
*
* @email josh_wang23@hotmail.com
*
*/
public class C3p0ConnectionPool {

private DataSource ds;

private static C3p0ConnectionPool pool;

private C3p0ConnectionPool() {
ds = new ComboPooledDataSource();
}

// 加上synchronized就是典型的同步模式
public static /*synchronized*/ final C3p0ConnectionPool getInstance() {
if (pool == null) {
try {
pool = new C3p0ConnectionPool();
} catch (Exception e) {
e.printStackTrace();
}
}

return pool;
}

// synchronized保证每个pool线程请求返回的都是不同的Connection
public synchronized final Connection getConnection() {
try {
Connection connection = ds.getConnection();
// 1)将配置文件中的c3p0.initialPoolSize,c3p0.minPoolSize,c3p0.maxPoolSize都改为1,然后执行查看结果
// 2)将配置文件中的c3p0.initialPoolSize,c3p0.minPoolSize,c3p0.maxPoolSize都改为较小的值,加大线程数,然后执行查看结果
System.out.println(" **** current connection number: " + ((ComboPooledDataSource)ds).getNumConnections()
+ " busy connection number: " + ((ComboPooledDataSource)ds).getNumBusyConnections()
+ " Idle connection nmuber: " + ((ComboPooledDataSource)ds).getNumIdleConnections());
return connection;
} catch (SQLException e) {
e.printStackTrace();
}

return null;
}


}
</pre>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;"><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">3、创建模拟用户发起数据库连接的Thread类</span></span></strong></p>
<p> </p>
<pre name="code" class="java">package com.wsheng.aggregator.c3p0;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
* @author Josh Wang(Sheng)
*
* @email josh_wang23@hotmail.com
*
*/
public class C3p0PoolThread extends Thread {

@Override
public void run() {
C3p0ConnectionPool pool = C3p0ConnectionPool.getInstance();
Connection connection = null;
PreparedStatement stmt = null;
ResultSet rs = null;

try {
connection = pool.getConnection();
stmt = connection.prepareStatement("select sysdate() as nowtime from dual");
rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(Thread.currentThread().getId() + "---------------开始" + rs.getString("nowtime"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}

System.out.println(Thread.currentThread().getId() + "--------结束");

}


}
</pre>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;"><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">4、Main类</span></span></strong></p>
<p> </p>
<pre name="code" class="java">package com.wsheng.aggregator.c3p0;

/**
* @author Josh Wang(Sheng)
*
* @email josh_wang23@hotmail.com
*
*/
public class C3p0Main {

public static void main(String[] args) {
System.out.println("数据库连接池模拟开始");
C3p0PoolThread[] threads = new C3p0PoolThread[100];

for (int i = 0; i < threads.length;i++) {
threads[i] = new C3p0PoolThread();
}

for (int i= 0;i < threads.length; i++) {
threads[i].start();
}
}

}
</pre>
<p><strong> 在C3p0Main.java中可以增加线程数,也可以再c3p0.properties中减少c3p0.maxPoolSize, c3p0.minPoolSize, c3p0.initialPoolSize等的值来查看执行结果。</strong></p>
<p> </p>
<p><strong>四、常用配置参数的说明:</strong></p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">1.最常用配置</span></strong></p>
<p> </p>
<p style=""><strong>initialPoolSize:</strong> 连接池初始化时创建的连接数,default : 3(建议使用)</p>
<p style=""><strong>minPoolSize: </strong>连接池保持的最小连接数,default : 3(建议使用)</p>
<p style=""><strong>maxPoolSize: </strong>连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15(建议使用)</p>
<p style=""><strong>acquireIncrement:</strong>连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3(建议使用)</p>
<p> </p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">2.管理连接池的大小和连接的生存时间</span></strong></p>
<p> </p>
<p style=""><strong>maxConnectionAge</strong>:配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。default : 0 单位 s(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>maxIdleTime:</strong>连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。default : 0 单位 s(建议使用)</p>
<p style=""> </p>
<p style=""><strong>maxIdleTimeExcessConnections:</strong>这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于maxIdleTime。其实这个没必要配置,maxIdleTime已经配置了。default : 0 单位 s(不建议使用)</p>
<p> </p>
<p><strong><span style="color: #000000; font-family: Helvetica,Tahoma,Arial,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 25.2px; text-align: left; text-indent: 0px; white-space: normal; display: inline ! important; float: none; background-color: #ffffff;">3.配置连接测试:</span></strong></p>
<p> </p>
<p style=""><strong>automaticTestTable:</strong>配置一个表名,连接池根据这个表名用自己的测试sql语句在这个空表上测试数据库连接,这个表只能由c3p0来使用,用户不能操作。default : null(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>preferredTestQuery:</strong>与上面的automaticTestTable二者只能选一。自己实现一条SQL检测语句。default : null(建议使用)</p>
<p style=""> </p>
<p style=""><strong>idleConnectionTestPeriod:</strong>用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL8小时无会话的状态打破。为0则不测试。default : 0(建议使用)</p>
<p style=""> </p>
<p style=""><strong>testConnectionOnCheckin:</strong>如果为true,则在close的时候测试连接的有效性。default : false(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>testConnectionOnCheckout:</strong>性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,尽量不要用。default : false(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>4.配置PreparedStatement缓存:</strong></p>
<p style=""><strong>maxStatements:</strong>连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。同时maxStatementsPerConnection的配置无效。default : 0(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>maxStatementsPerConnection:</strong>连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。default : 0(看情况而论)</p>
<p style=""> </p>
<p style=""><strong>5.重连相关配置 </strong></p>
<p style=""><strong>acquireRetryAttempts:</strong>连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。default : 30(建议使用)</p>
<p style=""> </p>
<p style=""><strong>acquireRetryDelay:</strong>连接池在获得新连接时的间隔时间。default : 1000 单位ms(建议使用)</p>
<p style=""> </p>
<p style=""><strong>breakAfterAcquireFailure:</strong>如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。default : false(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>checkoutTimeout:</strong>配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException。其实就是acquireRetryAttempts*acquireRetryDelay。default : 0(与上面两个,有重复,选择其中两个都行)</p>
<p style=""> </p>
<p style=""><strong>6.定制管理Connection的生命周期</strong></p>
<p style=""><strong>connectionCustomizerClassName:</strong>用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在Connection丢弃的时候进行资源关闭,</p>
<p style="">就可以通过继承一个AbstractConnectionCustomizer来实现相关方法,配置的时候使用全类名。有点类似监听器的作用。default : null(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>7.配置未提交的事务处理 </strong></p>
<p style=""><strong>autoCommitOnClose:</strong>连接池在回收数据库连接时是否自动提交事务。如果为false,则会回滚未提交的事务,如果为true,则会自动提交事务。default : false(不建议使用)</p>
<p style=""><strong>forceIgnoreUnresolvedTransactions:</strong>这个配置强烈不建议为true。default : false(不建议使用)</p>
<p style="">一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?</p>
<p style=""> </p>
<p style=""><strong>8.配置debug和回收Connection</strong></p>
<p style=""><strong>unreturnedConnectionTimeout:</strong>为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭情况的不是很适用。建议手动关闭。default : 0 单位 s(不建议使用)</p>
<p style=""> </p>
<p style=""><strong>debugUnreturnedConnectionStackTraces:</strong>如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为打印堆栈信息会减慢getConnection的速度default : false(不建议使用)</p>
<p style=""> </p>
<p style="">其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来。</p>
<p> </p>
</div>
使用spring mvc+c3p0+jpa 框架搭建环境 花费了将近2天的时间,终于把基础框架搭建起来了,只想说,度娘有时候也不灵光,很多人只是胡乱COPY,根本没有严谨验证。本基础框架采用 spring mvc+c3p0+jpa的配置方式,里面配置了spring事务管理,异常处理,登陆拦截器 等,全部自己动手搭建,经过测试通过。如果你苦于一个万能的java ee框架搭建,你可以参考。个人喜欢专研技术,但不喜欢天天没日没夜的加班,程序员不该是机器码农,他们该有他们的良好生活。珍惜生命,远离加班。。。愿天下程序员都身体健康。还有一句,我叫超哥,一名喜欢代码的程序员。 立即下载

相关推荐

c3p0数据库连接池

c3p0数据库连接池

数据库连接池-c3p0

C3P0是一JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用它的开源项目有Hibernate、Spring等。dbcp没有自动回收空闲连接的功能c3p0有自动回收空闲连接功能当我们在进行基于数据库的web程序开发时,我们可以先在主程序(如Servlet、Bean)中通过JDBC中的DriverManager建立数据库连接,然后将要对数据库进行操作的sql语句封装到Statement中,最后在返回结果集后断开数据库连接。...

qq_61727355的博客 3215

C3P0数据库连接池

C3P0数据库连接池和jar包,因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化连接,随时取用,则平均每次取用只需要10-20毫秒。这在高并发随机访问数据库的时候对效率的提升有很大帮助。

C3P0(数据库连接池)详解

C3P0是一个开源的JDBC连接池

five小点心的博客 1万+

多周期路径及set_multicycle_path详解

默认情况下,每条路径都被定义为单周期,即源触发器在时钟的任一边沿启动(launch)的数据都应该由目的触发器在时钟的下一上升沿捕获(capture)。 有的设计需要在数据被捕获前提供一些额外的周期,这类路径被称为多周期路径。 一、set_multicycle_path命令 命令格式如下: set_multicycle_path .........

Jackiezhang1993的博客 4万+

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置)

本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。

weixin_29248653的博客 357

数据库连接池C3P0使用配置

C3P0 是一个开源的 JDBC 连接池实现库,能够自动管理数据库连接。它支持自动回收空闲连接、超时检测、连接测试等功能,广泛用于 Java Web 项目中。C3P0 是一个老牌稳定的连接池,适合中小型项目或对性能要求不高的场景。合理配置参数、定期测试连接有效性、监控连接池状态,是保证系统稳定运行的关键。如果你有更具体的场景或问题,欢迎补充说明,我可以帮你定制优化建议!

onlymscn的博客 1010

从零到一:手把手教你用YonBuilder for NCC搭建NC Cloud 2021.11开发环境(含避坑指南)

本文详细指导如何使用YonBuilder for NCC搭建NC Cloud 2021.11开发环境,涵盖硬件要求、软件安装、YonBuilder配置及常见故障排除。特别提供避坑指南,帮助开发者快速上手NCC开发,确保环境配置的原子化分解和开发思维的体系化建立。

weixin_42523326的博客 344

万字长文深入浅出数据库连接池 HikariCP/Commons DBCP/Tomcat/c3p0/druid 对比

数据库连接池在日常开发中几乎是必备的技能,但是很多知识大多比较零散。这里老马为大家简单做一个汇总,便于查阅学习。许多Apache项目支持与关系型数据库进行交互。为每个用户创建一个新连接可能很耗时(通常需要多秒钟的时钟时间),以执行可能需要毫秒级时间的数据库事务。对于一个公开托管在互联网上的应用程序,在同时在线用户数量可能非常大的情况下,为每个用户打开一个连接可能是不可行的。因此,开发人员通常希望在所有当前应用程序用户之间共享一组“池化”的打开连接。

1943

WGCNA样本量不够怎么办?5种替代方案帮你解决小样本基因共表达分析难题

本文针对WGCNA样本量不足的问题,提供了5种科学替代方案,包括CEMiTool、参数调整、多组学数据整合、机器学习特征提取和公共数据利用。这些方法帮助研究者在小样本条件下仍能进行可靠的基因共表达分析,特别适用于罕见病和珍贵临床样本研究。

weixin_42554042的博客 303

9、自动定理证明的发展历程与关键技术

本文全面介绍了自动定理证明的发展历程、关键技术及其实际应用,包括消解原理、参数化、支撑集策略等核心方法,并探讨了算法优化、数据结构优化及并行计算等提升效率的手段。同时,文章展望了未来发展方向,如深度学习在定理证明中的应用、交互式定理证明以及高阶逻辑的研究前景。

ll5678的博客 505

数据库连接池技术详解

前言 今天来讲一下数据库连接池技术.其实这个名词也就是听起来高大上一点,实际上并不是很复杂的内容,相信在我的讲解下,并且自己实际的将代码写一遍之后,能够对这项技术有较为深刻的理解.废话不多说,开始讲解. 数据库连接池技术概述 所谓的数据库连接池技术,就是用来分配,管理,释放数据库连接的.你也许会问,好像我直接用JDBC也能够实现这些功能吧. 嗯,你说的没错,JDBC确实也可以,但是,你...

最高权限比特流 2502

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1194

数据库连接池技术详解【吐血整理,疯狂推荐】

前言 今天来讲一下数据库连接池技术.其实这个名词也就是听起来高大上一点,实际上并不是很复杂的内容,相信在我的讲解下,并且自己实际的将代码写一遍之后,能够对这项技术有较为深刻的理解.废话不多说,开始讲解. 数据库连接池技术概述 所谓的数据库连接池技术,就是用来分配,管理,释放数据库连接的.你也许会问,好像我直接用JDBC也能够实现这些功能吧. 嗯,你说的没错,JDBC确实也可以,但是,你记不记得,我们使用JDBC技术的时候,每次用完了,是不是都会将连接关闭;等到下一次再用的时候,是不是都得将数据库连接再打开?

weixin_43899069的博客 1323

反应动力学仿真软件:Kintecus_(12).高级功能与技巧

Kintecus允许用户自定义复杂的反应方程,包括非线性反应和多相反应。通过自定义反应方程,用户可以更准确地描述实际反应系统。多尺度仿真是指在同一模型中同时考虑不同时间和空间尺度的反应过程。Kintecus提供了工具来处理从微观分子动力学到宏观反应动力学的多尺度仿真。通过本节的学习,您已经掌握了Kintecus的高级功能与技巧,包括复杂反应网络的构建、参数优化与敏感性分析、自定义反应机制、多尺度仿真、并行计算与批处理,以及数据可视化与后处理。

kkchenjj的博客 1048

嵌入式工程师成长之路(0)----认识元件

在电子设计与维修中,认识元件是成功的关键!面对琳琅满目的电阻、电容、电感与二极管,样子形式千奇百怪,你是否也曾陷入困难? 本文基于行业权威分类标准,结合十年工程师实战经验,深度解析4大类、30+子类电子元件的核心特性、应用场景与避坑指南,助你从“小白”秒变“电子高手”!

云轩阁 11万+

新版JDBC核心技术视频教程

01- JDBC核心技术-JDBC课程内容概述.avi 02- JDBC核心技术-课件结构说明与数据库数据的导入.avi 03- JDBC核心技术-软件架构方式介绍.avi 04- JDBC核心技术-JavaWeb技术概览.avi 05- JDBC核心技术-JDBC概述.avi 06- JDBC核心技术-JDBC程序编写步骤.avi 07- JDBC核心技术-获取数据库连接的方式一.avi 08-...

m0_46238573的博客 145

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JDBC核心技术

JDBC 看尚硅谷JDBC做的一些笔记 第一章:JDBC概述 1.1、JDBC介绍 1.2、JDBC程序编写步骤 (1)导入java.sql包 (2)加载MySQL驱动 (3)创建Connection对象,建立与数据库连接 (4)创建Statement对象,操作数据库(增删改查) (5)创建ResultSet对象,获取查询结果 (6)关闭Statement对象,关闭Connection对象 第二章:获取数据库连接 2.1、方式一 //方式一 @Test public void testConnection(

Lbjbong的博客 169

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java一分钟之-JDBC连接池:HikariCP, Apache DBCP, C3P0

HikariCP以其极低的延迟和卓越的性能被誉为“最快的JDBC连接池”。它实现了“零加锁”并发控制机制,优化了线程与内存的使用,特别适合高并发场景。Apache DBCP是一个成熟的开源连接池项目,提供了基本的连接池功能,虽然性能不如HikariCP,但胜在稳定性和易于配置。C3P0是一个灵活且高度可配置的JDBC连接池,支持自动回收空闲连接和失败重试,适用于需要更多自定义选项的应用场景。选择合适的JDBC连接池对于提升Java应用的性能至关重要。HikariCP以其高性能成为首选;

zevjay的博客 843

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c3p0 数据池入门使用教程

检入池中的Connections和Statements时,会仔细清理Statement和ResultSet,以防止客户端使用仅清理其Connections的惰性但常见的资源管理策略时资源耗尽。一个类,它使传统的基于DriverManager的JDBC驱动程序适应最新的javax.sql.DataSource方案,以获取数据库连接。c3p0是一个易于使用的库,通过使用jdbc3规范和jdbc2的可选扩展定义的功能来扩展传统JDBC驱动程序,从而使其“企业就绪”。请提供反馈,错误修复等!

463

零额外开销最快的数据库连接池?HikariCP 入门介绍

HikariCP 是一个“零额外开销”的生产就绪的 JDBC 连接池。如果您打算使用此选项,请使用默认构造函数构造。该库大小约为130Kb,非常轻量级。Java 8 Maven 构件 (在这里阅读关于我们是如何做到的。,可以用来指定属性文件的位置。实例,属性文件将会被加载。还有一个可用的系统属性,

555

JDBC&数据库连接池技术&JDBCTemplate

JDBC: 入门概念 客户端操作 MySQL 数据库的方式: 使用第三方客户端来访问 MySQL:SQLyog、Navicat、SQLWave、MyDB Studio。。。 使用 MySQL 自带的命令行方式 通过 Java 来访问 MySQL 数据库 JDBC: jdbc java database connectivity。由java代码操控数据库是无法做到代码统一,不同数据库是不同的代码 本质: 定义的一套操作所有关系型数据库的规则即接口。各个数据库厂商去实现这套接口,提供数据

qq_33923644的博客 511
上一篇: Linux执行Cron Job失败,在Shell sh下执行却能成功 - 环境变量?
下一篇: 深入浅出数据库连接池c3p0
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值