- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章数据库连接池c3p0配置_动力节点Java学院整理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
c3p0的配置方式分为三种,分别是 。
1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 。
1.setters一个个地设置各个配置项 。
这种方式最繁琐,形式一般是这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Properties props =
new
Properties();
InputStream in = ConnectionManager.
class
.getResourceAsStream(
"/c3p0.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"
));
|
因为繁琐,所以很不适合采用,于是文档提供了另外另种方式.
2. 类路径下提供一个c3p0.properties文件 。
文件的命名必须是c3p0.properties,里面配置项的格式为:
1
2
3
4
|
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:
//localhost:3306/jdbc
c3p0.user=root
c3p0.password=java
|
上面只提供了最基本的配置项,其他配置项参照 文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:
1
2
3
4
5
6
7
8
9
10
11
|
private
static
ComboPooledDataSource ds =
new
ComboPooledDataSource();
public
static
Connection getConnection() {
try
{
return
ds.getConnection();
}
catch
(SQLException e) {
throw
new
RuntimeException(e);
}
}
|
3.类路径下提供一个c3p0-config.xml文件 。
这种方式使用方式与第二种差不多,但是有更多的优点 (1).更直观明显,很类似hibernate和spring的配置 (2).可以为多个数据源服务,提供default-config和named-config两种配置方式 下面是一个配置模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<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=
"myApp"
>
<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>
|
如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了 。
private static ComboPooledDataSource ds = new ComboPooledDataSource("myApp"); 下面整理一下从文档和网上学习到的c3p0配置的理解 (user,password,driverClass,jdbcUrl没有说的必要) 。
1.基本配置项 。
acquireIncrement 。
default : 3 。
连接池在无空闲连接可用时一次性创建的新数据库连接数 。
initialPoolSize 。
default : 3 。
连接池初始化时创建的连接数 。
maxPoolSize 。
default : 15 。
连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待 。
其他连接释放,所以这个值有可能会设计地很大 。
maxIdleTime 。
default : 0 单位 s 连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接 如果为0,则永远不会断开连接 。
minPoolSize default : 3 连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载 。
2.管理连接池的大小和连接的生存时间 。
maxConnectionAge 。
default : 0 单位 s 。
配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待 。
它close再断开。配置为0的时候则不会对连接的生存时间进行限制.
maxIdleTimeExcessConnections 。
default : 0 单位 s 。
这个配置主要是为了减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接 。
但是后面的时间段需要的数据库连接数很少,则此时连接池完全没有必要维护那么多的连接,所以有必要将 。
断开丢弃掉一些连接来减轻负载,必须小于maxIdleTime。配置不为0,则会将连接池中的连接数量保持到minPoolSize.
为0则不处理.
maxIdleTime也可以归属到这一类,前面已经写出来了.
3.配置连接测试:因为连接池中的数据库连接很有可能是维持数小时的连接,很有可能因为数据库服务器的问题,网络问题等导致实际连接已经无效,但是连接池里面的连接还是有效的,如果此时获得连接肯定会发生异常,所以有必要通过测试连接来确认连接的有效性。 下面的前三项用来配置如何对连接进行测试,后三项配置对连接进行测试的时机.
automaticTestTable 。
default : null 。
用来配置测试连接的一种方式。配置一个表名,连接池根据这个表名创建一个空表, 。
并且用自己的测试sql语句在这个空表上测试数据库连接 。
这个表只能由c3p0来使用,用户不能操作,同时用户配置的preferredTestQuery 将会被忽略.
preferredTestQuery 。
default : null 。
用来配置测试连接的另一种方式。与上面的automaticTestTable二者只能选一.
如果要用它测试连接,千万不要设为null,否则测试过程会很耗时,同时要保证sql语句中的表在数据库中一定存在.
connectionTesterClassName 。
default : com.mchange.v2.c3p0.impl.DefaultConnectionTester 。
连接池用来支持automaticTestTable和preferredTestQuery测试的类,必须是全类名,就像默认的那样, 。
可以通过实现UnifiedConnectionTester接口或者继承AbstractConnectionTester来定制自己的测试方法 。
idleConnectionTestPeriod 。
default : 0 。
用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它 。
保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL 。
8小时无会话的状态打破。为0则不测试.
testConnectionOnCheckin 。
default : false 。
如果为true,则在close的时候测试连接的有效性。为了提高测试性能,可以与idleConnectionTestPeriod搭配使用, 。
配置preferredTestQuery或automaticTestTable也可以加快测试速度.
testConnectionOnCheckout 。
default : false 性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能, 。
可以与idleConnectionTestPeriod搭配使用, 。
配置preferredTestQuery或automaticTestTable也可以加快测试速度.
4.配置PreparedStatement缓存 。
maxStatements default : 0 连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以 这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存, 同时maxStatementsPerConnection的配置无效.
maxStatementsPerConnection default : 0 连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为 它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存.
5.重连相关配置 。
acquireRetryAttempts 。
default : 30 。
连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功 。
acquireRetryDelay 。
default : 1000 单位ms 。
连接池在获得新连接时的间隔时间 。
breakAfterAcquireFailure default : false 。
如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。 个人觉得上述三个没有更改的必要,但可以将acquireRetryDelay配置地更短一些 。
6.定制管理Connection的生命周期 。
connectionCustomizerClassName default : null 用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在 Connection丢弃的时候进行资源关闭,就可以通过继承一个AbstractConnectionCustomizer来实现相关 。
方法,配置的时候使用全类名。有点类似监听器的作用。 例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import
java.sql.Connection;
import
com.mchange.v2.c3p0.AbstractConnectionCustomizer;
public
class
ConnectionCustomizer
extends
AbstractConnectionCustomizer{
@Override
public
void
onAcquire(Connection c, String parentDataSourceIdentityToken)
throws
Exception {
System.out.println(
"acquire : "
+ c);
}
@Override
public
void
onCheckIn(Connection c, String parentDataSourceIdentityToken)
throws
Exception {
System.out.println(
"checkin : "
+ c);
}
@Override
public
void
onCheckOut(Connection c, String parentDataSourceIdentityToken)
throws
Exception {
System.out.println(
"checkout : "
+ c);
}
@Override
public
void
onDestroy(Connection c, String parentDataSourceIdentityToken)
throws
Exception {
System.out.println(
"destroy : "
+ c);
}
}
|
1
|
<property name=
"connectionCustomizerClassName"
>liuyun.zhuge.db.ConnectionCustomizer</property>
|
7.配置未提交的事务处理 。
autoCommitOnClose 。
default : false 。
连接池在回收数据库连接时是否自动提交事务 。
如果为false,则会回滚未提交的事务 。
如果为true,则会自动提交事务 。
forceIgnoreUnresolvedTransactions 。
default : false 。
这个配置强烈不建议为true。 一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
8.配置debug和回收Connection 一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
unreturnedConnectionTimeout default : 0 单位 s 为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收 Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭 情况的不是很适用。为0不对connection进行回收,即使它并没有关闭.
debugUnreturnedConnectionStackTraces default : false 如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接 unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为 打印堆栈信息会减慢getConnection的速度 同第七项一样的,连接用完当然得close了,不要通过unreturnedConnectionTimeout让连接池来回收未关闭的连接.
9.其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来 。
checkoutTimeout default : 0 配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放 或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException 。
3、示例:
示例采用第二种方式:
1.c3p0.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#驱动
c3p0.driverClass=com.mysql.jdbc.Driver
#地址
c3p0.jdbcUrl=jdbc:mysql:
//localhost:3306/jdbc
#用户名
c3p0.user=root
#密码
c3p0.password=lovejava
#-------------------------------
#连接池初始化时创建的连接数
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
|
2.ConnectionPool 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package
com.study.pool;
import
java.sql.Connection;
import
java.sql.SQLException;
import
javax.sql.DataSource;
import
com.mchange.v2.c3p0.ComboPooledDataSource;
public
class
ConnectionPool {
private
DataSource ds;
private
static
ConnectionPool pool;
private
ConnectionPool(){
ds =
new
ComboPooledDataSource();
}
public
static
final
ConnectionPool getInstance(){
if
(pool==
null
){
try
{
pool =
new
ConnectionPool();
}
catch
(Exception e) {
e.printStackTrace();
}
}
return
pool;
}
public
synchronized
final
Connection getConnection() {
try
{
return
ds.getConnection();
}
catch
(SQLException e) {
e.printStackTrace();
}
return
null
;
}
}
|
3.PoolThread 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package
com.study.pool;
import
java.sql.Connection;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
java.sql.SQLException;
public
class
PoolThread
extends
Thread {
@Override
public
void
run(){
ConnectionPool pool = ConnectionPool.getInstance();
Connection con =
null
;
PreparedStatement stmt=
null
;
ResultSet rs =
null
;
try
{
con = pool.getConnection();
stmt = con.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();
con.close();
}
catch
(SQLException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getId()+
"--------结束"
);
}
}
|
4.PoolMain 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package
com.study.pool;
public
class
PoolMain {
/**
* 数据源缓冲池 实例练习
*/
public
static
void
main(String[] args) {
System.out.println(
"缓冲池模拟开始"
);
PoolThread[] threads =
new
PoolThread[
50
];
for
(
int
i=
0
;i<threads.length;i++){
threads[i] =
new
PoolThread();
}
for
(
int
i=
0
;i<threads.length;i++){
threads[i].start();
}
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于数据库连接池c3p0配置_动力节点Java学院整理的文章就讲到这里了,如果你想了解更多关于数据库连接池c3p0配置_动力节点Java学院整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
最近,我们将专用 SQL 池部署到生产中的 Synapse 工作区。在开发中,我们可以访问无服务器 SQL 池和专用 SQL 池。但是,在生产中,我们可以访问无服务器 SQL 池,但无法访问专用 SQ
假设您从一个项目公开 WCF 服务,并使用“添加服务引用”(在本例中为 Framework 3.5 WPF 应用程序)在另一个项目中使用它。 当您重新实例化 ClientBase 派生代理时,Clie
我有一个函数,它使用 multiprocessing.Pool 并行处理一个数据集中的所有数据。 from multiprocessing import Pool ... def func():
我正在尝试使用进程对象在 python 中使用工作池。每个 worker (一个进程)进行一些初始化(花费大量时间),传递一系列作业(理想情况下使用 map()),并返回一些东西。除此之外,不需要任何
我是软件工程师,最近我构建了我的 Linux 机器,想探索更多系统管理员类型的任务。我已经探索并阅读了很多关于 ZFS 的内容,但我越来越困惑,因为每篇文章对它的描述都不一样。 Everything
我有 zfs 池: $ sudo zpool status lxd pool: lxd state: ONLINE scan: none requested config: NAME
我有一个基于 Actor 的项目,对于其中的一部分,我必须使用一些接收消息的 Actor ,然后一个 Actor 分别分配给每个请求,每个 Actor 负责执行其消息请求,所以我需要类似线程的东西我的
我已经使用 QEMU 模拟器成功地将 FreeBSD 安装到原始图像文件中。我已经使用 ZFS 文件系统 (ZFS POOL) 格式化了图像文件。 使用下面的命令我已经成功地挂载了准备好由 zpool
我正在使用 multiprocessor.Pool并行处理一些文件。该代码等待接收文件,然后使用 Pool.apply_async 将该文件发送给工作人员。 ,然后处理文件。 这段代码应该一直在运行,
我正在使用带有光滑的 Bonecp 数据源。并发现池包含关闭的连接所以我总是遇到这个异常 java.sql.SQLException: Connection is closed! at com
我有apartment gem的 Multi-Tenancy Rails应用程序,我可以使用apartment-sidekiq在每个工作程序中成功切换数据库租户。但是,sidekiq worker 正
ZFS 池可能由数据集(文件系统、快照等)或卷组成。 ZFS 卷就像 block 设备,但我不明白池和文件系统之间的区别。当我通过 zpool create pool1 sda sdb sdc 创建
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我在tomcat中有一个jdbc池,用于建立数据库连接。我在使用后没有显式关闭连接对象。我的“maxActive”参数设置为100。应用程序运行了一段时间,但随后失败进行数据库查询。它会等待无限时间来
阅读 PostgreSQL 文档 here我读了以下内容: As well, connections requested for users other than the default config
我在 docker 容器上运行了 airflow。我正在使用 airflow 2.0.2 版。 我知道我实际上可以通过 UI 创建池。但我正在寻找一种通过 pools.json 文件在 docker
我正在读取一个大的 URL 文件并向服务发出请求。该请求由返回 ListenableFuture 的客户端执行。现在我想保留一个 ListenableFuture 池,例如最多同时执行 N 个 Fut
我想使用队列来保存结果,因为我希望消费者(串行而不是并行)在工作人员产生结果时处理工作人员的结果。 现在,我想知道为什么以下程序挂起。 import multiprocessing as mp imp
我正在开发一个单页应用程序,目前正在构建一个 JQuery、ajax 函数,以便我的所有调用都能通过。 对于一个典型的页面,我可能有 3 个 ajax 调用。我的想法是,如果用户互联网出去将这些 aj
我有一个单位类及其一些子类(弓箭手、剑客等)。我怎样才能创建一个回收所有单元类型子类的池? 最佳答案 这是不可能的,因为池只能包含一种特定类型的对象。否则你可能会遇到这样的情况: Pool unitP
我是一名优秀的程序员,十分优秀!