Java中常用的数据库连接池
- 格式:pdf
- 大小:949.68 KB
- 文档页数:19
java hikaripool 保持永久连接的方法JavaHikari连接池是一个高效的连接池实现,可以帮助Java应用程序管理数据库连接。
但是,由于连接池中的连接是有限的,我们需要确保它们被充分利用。
在本文中,我们将介绍一些方法,帮助您保持Hikari连接池中的连接始终处于活动状态。
1. 设置连接超时时间连接池中的连接如果长时间处于空闲状态,就会被连接池回收。
为了避免连接回收,可以设置连接超时时间。
在Hikari连接池中,我们可以使用以下属性来设置连接超时时间:```dataSource.setMaximumPoolSize(10);dataSource.setMinimumIdle(1);dataSource.setIdleTimeout(60_000);```这将确保连接在空闲一段时间后被回收之前,始终保持活动状态。
2. 使用心跳检测有时候,连接池中的连接可能会因为网络问题或其他原因被意外断开。
在这种情况下,我们可以使用心跳检测来检测连接是否仍然有效。
在Hikari连接池中,我们可以使用以下属性来启用心跳检测:```dataSource.setConnectionTestQuery('SELECT 1');dataSource.setConnectionTimeout(30_000);dataSource.setValidationTimeout(5_000);```这将确保在连接池中的连接断开时,能够及时检测到并重新建立连接。
3. 使用连接池监控连接池监控可以帮助我们了解连接池中的连接使用情况,并根据需要进行优化。
在Hikari连接池中,我们可以使用以下属性来启用连接池监控:```dataSource.setMetricRegistry(metricRegistry);dataSource.setHealthCheckRegistry(healthCheckRegistry); ```这将为我们提供有关连接池中连接的详细信息,例如活动连接数、空闲连接数和连接等待时间。
MyBatis还是JPA?终于有答案了对于⼀个和数据库打交道的程序员来说,很快会⾯临着⼀个艰难的选择。
到底是选择MyBatis还是JPA呢?很多⼈说,技术选择,都要根据需求来,这个没错。
但是,除了需求,还有很重要的⼀个环节,那就是队友的⽔平。
如果你选择了⼀些⽐较⾼级的技术,那么就是在给整个团队埋坑。
JPA的抽象层次更⾼,代码写起来也更简洁,但是它⼀点都不简单。
虽然经过了多次的培训,我呆过的⼏个团队,还是把它⽤的和屎⼀样。
我扔掉了JPA我仔细想了⼀下,有下⾯⼏点原因,造成了JPA在很多团队根本就玩不下去。
JPA适合业务模型固定的场景,适合⽐较稳定的需求。
但是国内这种朝三暮四的需求风格,产品经理这种传话筒式的设计模式,造成了需求的泛滥和不确定。
JPA在这种模式下就是渣。
JPA的技术要求⽐较⾼。
不要怀疑,你刚开始⽤起⾥可能觉得⾮常简单。
但随着你的深⼊使⽤,你会发现这是⼀个灾难。
⾥⾯的各种转换和缓存,会把⼈绕晕。
⽽⼤多数的快餐程序员是不想要了解这些的。
很多程序员很会写SQL,所以很多SQL语句长的很胖,长的要命。
业务混乱,多张表关联,我甚⾄见过上百张业务表关联的复杂业务。
DBA⽆奈之下,通常都会有sql审核。
JPA搞sql审核?还是弱了⼀点。
所以,不是JPA不好,⽽是它不符合国情⽽已。
想要在公司内推⾏JPA,你需要给我⼀个稳定的产品团队、⼀个⽜X的技术团队才⾏。
所以,⼤多数公司宁可写⼀堆重复的、乱七⼋糟的Mybaits代码,也不会轻易尝试JPA,这是符合逻辑的,符合事物发展规律的。
所以,我们下⾯的⽂章就是来讨论MyBatis的,来看⼀下Mybaits到底要怎么写才算优雅。
MyBatis为什么不好⽤优秀的程序员都是很懒的。
所以很多⼈不想设计实体的sql。
JPA可以直接根据Java的实体代码,⽣成sql的库表,这在使⽤Mybatis的⼈来看,是⾮常羡慕的。
使⽤MyBatis,要倒着来。
需要先设计库表,然后根据库表反向⽣成⼀堆Java代码和配置⽂件。
jdbc连接池默认值JDBC(Java Database Connectivity)连接池是用于管理数据库连接的一种技术。
它允许应用程序从连接池中获取数据库连接,使用完毕后将连接返回给连接池,以便其他应用程序可以继续使用。
在使用JDBC连接池时,了解默认配置值对于进行合理的配置至关重要。
一、JDBC连接池概述JDBC连接池是运行在服务器上的一个数据库连接池,它维护着多个数据库连接。
应用程序可以通过请求从连接池中获取一个可用的连接,并在使用完毕后将连接返回给连接池。
连接池可以有效地管理数据库连接,减少因频繁创建和关闭连接所带来的性能损耗。
二、默认连接池配置参数在JDBC连接池的配置中,有一些默认的参数值。
下面是一些常见的默认连接池配置参数:1. 最小空闲连接数(Min Idle Connections):默认值为0。
指定连接池中最小空闲连接的数量。
即使没有正在使用的连接,连接池也会保持该数量的空闲连接。
2. 最大活动连接数(Max Active Connections):默认值为8。
指定连接池中最大的活动连接数。
当请求连接时,如果连接池中所有连接都在使用中,连接池将等待,直到有连接返回。
3. 最大等待时间(Max Wait Time):默认值为-1。
指定从连接池中获取连接的最大等待时间。
当连接池中所有连接都在使用中且达到最大活动连接数时,如果超过最大等待时间仍无法获取连接,将抛出异常。
4. 连接有效性验证查询(Validation Query):默认值为null。
指定用于验证连接是否有效的SQL查询语句。
连接池会定期执行该查询语句,如果查询失败或返回的结果不符合要求,连接将被标记为无效并从连接池中移除。
5. 连接超时时间(Connection Timeout):默认值为-1。
指定从连接池获取连接的最大等待时间。
当连接池中无可用连接且达到最大等待时间时,将抛出异常。
三、自定义连接池配置尽管有默认的连接池配置参数,但根据实际需求,我们可以自定义连接池的配置。
Java中的JDBC数据库操作技巧一、JDBC简介JDBC全称为Java Database Connectivity,是Java的一个标准API,用于与各种关系型数据库进行连接、查询、更新等操作。
JDBC提供了一套基于SQL的编程接口,能够让Java程序无需了解底层数据库的细节即可进行数据库操作。
二、JDBC驱动类型JDBC驱动是一个程序模块,用于实现JDBC的API并与具体的数据库进行通信。
JDBC驱动可以分为四种类型:1、JDBC-ODBC桥接式驱动:使用ODBC驱动访问数据库。
这种驱动依赖于底层操作系统的ODBC机制,因此只能在Windows系统中使用。
2、本地式驱动:这种驱动实现了JDBC的API,并且直接与数据库交互。
由于直接调用数据库的API,因此效率要比桥接式驱动高。
3、网络式驱动:这种驱动通过网络协议与数据库进行通信。
大多数商用数据库都支持这种驱动,因此可以跨平台使用。
4、纯Java式驱动:这种驱动完全由Java实现,并且直接与数据库进行通信。
由于没有依赖于底层操作系统的机制,因此可以跨平台使用。
三、JDBC连接数据库JDBC连接数据库通常分为以下步骤:1、加载JDBC驱动在使用JDBC之前,必须先加载相应的JDBC驱动类。
可以通过Class.forName()方法来加载驱动,该方法的参数是完整的类名。
2、连接数据库连接数据库需要的参数通常包括数据库的URL、用户名和密码等。
可以使用DriverManager.getConnection()方法来建立连接,该方法的参数是一个包含数据库连接信息的字符串。
3、关闭连接在使用完连接后,必须调用Connection.close()方法来关闭连接,以便释放资源。
四、JDBC执行SQL语句JDBC可以执行各种类型的SQL语句,包括查询语句、更新语句、存储过程等。
1、执行查询语句可以使用Statement或PreparedStatement对象来执行查询语句。
redistemplate默认连接池设置Redisson 是一个在 Java 中实现的 in-memory 数据库 Redis 的客户端,它提供了很多高级功能,如分布式对象、分布式锁、闭包、队列、集合等。
在 Redisson 中,RedissonTemplate 是用于操作 Redis 服务的核心类。
关于 RedissonTemplate 的默认连接池设置,这些设置通常在创建 Redisson 实例时进行配置。
以下是默认的连接池设置:连接池大小:默认是 10。
最大连接池大小:默认是 100。
空闲连接的保持时间:默认是 300000 毫秒(5 分钟)。
获取连接的最大等待时间:默认是 30000 毫秒(30 秒)。
验证查询:默认没有设置。
如果你想改变这些默认设置,可以在创建 Redisson 实例时提供一个自定义的 Config 对象。
例如:javaConfig config = new Config();eSingleServer().setAddress("redis://127.0.0.1:6379").setConnectionPoolSize(5) // 设置连接池大小为5.setConnectionMinimumIdleSize(3) // 设置最小空闲连接数为3.setConnectionPoolTimeout(10000) // 设置获取连接的最大等待时间为10000毫秒.setRetryAttempts(3) // 设置重试次数为3.setRetryInterval(1500); // 设置重试间隔为1500毫秒RedissonClient redisson = Redisson.create(config);请注意,上述设置只是示例,你可能需要根据你的实际需求进行调整。
java里hikaridatasource的resumepool()方法HikariDataSource的resumePool()方法详解概述在Java中,我们经常使用HikariCP作为连接池来管理数据库连接。
HikariDataSource是HikariCP的连接池实现类之一,它提供了一系列用于管理连接池的方法。
其中,resumePool()方法是用于恢复连接池的方法之一。
本文将对resumePool()方法进行详细说明。
resumePool()方法的作用resumePool()方法用于恢复连接池的正常工作状态。
当连接池由于某些原因处于暂停状态时,我们可以使用resumePool()方法将其恢复为可用状态。
使用resumePool()方法的步骤以下是使用resumePool()方法的基本步骤:1.创建HikariDataSource对象。
2.在需要恢复连接池的地方调用resumePool()方法。
示例代码HikariDataSource dataSource = new HikariDataSource (config); // 创建HikariDataSource对象// 其他操作(); // 调用resumePool()方法恢复连接池// 其他操作注意事项在使用resumePool()方法时,我们需要注意以下事项:•resumePool()方法只能在连接池暂停时调用,否则会抛出异常。
•调用resumePool()方法后,连接池将会恢复可用状态,可以继续使用。
总结resumePool()方法是HikariDataSource类中用于恢复连接池的方法。
通过调用该方法,我们可以将连接池从暂停状态恢复为可用状态,以保证数据库连接的正常使用。
在实际应用中,我们应该根据实际情况来决定是否需要使用resumePool()方法。
如果连接池暂停时需要进行一些特殊的处理或恢复操作,那么我们可以考虑使用resumePool()方法来实现。
druid数据库连接池的 querytimeout默认值 -回复 Druid数据库连接池是一个高效、稳定的Java连接池,它提供了很多配置选项,包括querytimeout(查询超时)的默认值。本文将重点讨论Druid数据库连接池的querytimeout默认值,以及如何调整和使用它。
第一步,我们先了解什么是Druid数据库连接池。Druid是阿里巴巴开发的一个高性能、可扩展的数据库连接池,被广泛应用于Java项目中。它提供了丰富的监控功能、SQL防火墙、批量处理、缓存等特性,使得应用程序可以更加高效地利用数据库连接。
下一步,我们来了解querytimeout的概念。Querytimeout是指在执行数据库查询时,如果查询花费的时间超过了事先设定的时间,连接池将会自动中断该查询并返回超时错误。这样可以避免出现某个查询长时间占用连接池资源的情况,从而保证连接池的可用性和性能。
接下来,我们探讨Druid数据库连接池的querytimeout默认值。在Druid连接池的默认配置中,并没有明确指定querytimeout的默认值。这意味着当我们使用Druid连接池时,默认情况下不会对查询设置超时时间。这可能是因为Druid默认将长时间的查询认为是用户自己的选择,因此没有设置默认的querytimeout。 然而,Druid连接池提供了一种简单的方式来为每个查询设置超时时间。我们可以使用setConnectionProperties方法来设置querytimeout属性,将超时时间以键值对形式添加到连接属性中。例如,我们可以通过以下方式为当前查询设置超时时间为5秒:
Properties properties = new Properties(); properties.setProperty("querytimeout", "5");
DruidDataSource dataSource = new DruidDataSource(); dataSource.setConnectionProperties(properties);
java关闭连接池的方法
在使用Java连接池时,我们需要在应用程序关闭时关闭连接池
以释放数据库连接资源。
以下是Java关闭连接池的方法:
1. 使用DataSource关闭连接池
DataSource是Java中常用的连接池接口,可以使用以下代码关闭连接池:
```java
DataSource dataSource = ... // 初始化连接池
if (dataSource instanceof Closeable) {
try {
((Closeable) dataSource).close();
} catch (IOException e) {
// 错误处理
}
}
```
2. 使用连接池提供的关闭方法
如果连接池实现类提供了关闭方法,可以使用该方法关闭连接池。
例如,使用Apache Commons DBCP连接池时,可以使用以下代码关闭连接池:
```java
BasicDataSource basicDataSource = ... // 初始化连接池
basicDataSource.close();
```
3. 触发连接池销毁
一些连接池实现类在应用程序关闭时会自动销毁连接池。
例如,使用HikariCP连接池时,可以使用以下代码关闭连接池:
```java
HikariDataSource hikariDataSource = ... // 初始化连接池 hikariDataSource.close();
```
无论使用哪种方法关闭连接池,都应该确保在应用程序关闭时释放数据库连接资源,以免造成资源泄漏。
jdbc连接池参数jdbc连接池参数的设置是在进行数据库连接时非常重要的一部分,它可以有效地管理连接的创建和销毁,提高数据库访问的性能和效率。
下面将介绍一些常用的jdbc连接池参数及其作用。
1. 初始化连接数(initialSize):指定连接池在启动时初始化的连接数。
通过设置适当的初始连接数,可以在系统启动时预先创建一定数量的数据库连接,以便后续的数据库操作能够迅速得到响应。
2. 最小空闲连接数(minIdle):指定连接池中保持的最小空闲连接数。
当连接池中的连接数低于该值时,连接池会自动创建新的连接。
3. 最大空闲连接数(maxIdle):指定连接池中保持的最大空闲连接数。
当连接池中的连接数超过该值时,多余的连接会被销毁。
4. 最大连接数(maxActive):指定连接池中允许的最大连接数。
当连接池中的连接数达到该值时,后续的连接请求将被阻塞,直到有空闲连接可用。
5. 连接超时时间(maxWait):指定从连接池获取连接的最大等待时间。
当连接池中的连接都被占用时,新的连接请求将等待一段时间,如果超过设定的超时时间,将抛出连接超时的异常。
6. 验证连接的有效性(testOnBorrow):指定在从连接池中获取连接时,是否对连接进行有效性验证。
通过设置该参数,可以避免从连接池中获取到无效的连接。
7. 检测空闲连接的间隔时间(timeBetweenEvictionRunsMillis):指定检测空闲连接的时间间隔。
连接池会定期检测空闲连接的有效性,并且销毁无效的连接。
8. 连接的最大生存时间(maxAge):指定连接的最大生存时间。
如果连接在该时间段内没有被使用,连接池将会自动销毁该连接。
以上是一些常用的jdbc连接池参数,通过合理地设置这些参数,可以提高数据库访问的性能和效率。
在实际应用中,需要根据具体的情况进行调整和优化,以满足系统的需求。
druid数据库连接池的querytimeout默认值-回复Druid数据库连接池是一种高效、可靠的开源数据库连接池。
它支持诸如MySQL、Oracle、PostgreSQL等多种数据库,并提供了一系列的特性和功能,以提高数据库访问的性能和稳定性。
在使用Druid连接池时,querytimeout是一个非常重要的配置项,它定义了数据库查询的超时时间。
现在我们就来详细了解一下Druid数据库连接池的querytimeout默认值。
首先,我们需要明确Druid数据库连接池的基本概念。
连接池是一种能够管理和复用数据库连接的技术,它可以有效地减少数据库连接的创建和关闭开销,提高系统的性能和可伸缩性。
Druid数据库连接池是一种开源的Java连接池,它提供了诸如连接池大小控制、连接分布式集群管理、SQL 统计和防火墙等丰富的功能和特性。
接下来,我们需要了解一下querytimeout的概念。
querytimeout是一个用于定义数据库查询超时时间的配置项。
在进行数据库查询时,如果查询耗时超过了querytimeout定义的时间,数据库连接池将会中断查询操作,并抛出一个超时异常。
这个功能非常有用,因为它可以防止某些查询耗费过多的时间和资源,从而保证系统的稳定性和性能。
那么,Druid数据库连接池的querytimeout默认值是多少呢?根据Druid连接池的官方文档,Druid数据库连接池的querytimeout默认值是0,即没有超时限制。
这意味着,在默认情况下,Druid连接池不会对数据库查询设置任何超时限制,查询会持续执行直到完成或发生异常。
这对于某些查询可能会花费较长时间的场景来说是非常方便的。
但是,在某些特定的业务场景下,我们可能需要设置一个合理的querytimeout值。
这可以通过在连接URL中使用特定的连接参数来实现。
连接参数可以在连接URL中以连接属性的形式进行设置,用于配置连接池的各种属性和特性。
jdbc properties参数【原创版】目录1.JDBC 概述2.JDBC properties 参数的作用3.JDBC properties 参数的分类4.常用 JDBC properties 参数介绍5.JDBC properties 参数的设置方法6.总结正文一、JDBC 概述JDBC(Java Database Connectivity,Java 数据库连接)是 Java 中用于连接和操作数据库的一种技术标准。
它提供了一组用于访问关系型数据库的接口,可以使 Java 程序员在不关心具体数据库类型的情况下进行数据库操作。
二、JDBC properties 参数的作用在 JDBC 编程中,我们需要配置一些参数来连接数据库,这些参数被称为 JDBC properties 参数。
它们用于设置数据库连接的各种属性,例如数据库 URL、用户名、密码等。
通过设置 JDBC properties 参数,我们可以轻松地切换不同的数据库。
三、JDBC properties 参数的分类JDBC properties 参数主要分为以下几类:1.数据库连接参数:如数据库 URL、用户名、密码等。
2.数据库驱动参数:如驱动类名、驱动库路径等。
3.数据库连接池参数:如连接池大小、最大连接数等。
4.其他参数:如自动提交、事务隔离级别等。
四、常用 JDBC properties 参数介绍1.数据库连接参数- 数据库 URL:用于指定数据库的地址和端口,格式为:jdbc:数据库类型://主机名:端口/数据库名。
- 用户名:用于登录数据库的用户名。
- 密码:用于登录数据库的密码。
2.数据库驱动参数- 驱动类名:用于指定连接数据库所使用的驱动类名称。
- 驱动库路径:用于指定驱动类所在的 jar 文件路径。
3.数据库连接池参数- 连接池大小:用于指定连接池中的最大连接数。
- 最大连接数:用于指定连接池中最多允许的并发连接数。
java里hikaridatasource的resumepool()方法HikariDataSource是一个高性能的数据库连接池库,它可以在Java应用程序中连接和管理数据库连接。
其中的resumePool()方法用于重新启用连接池。
在了解resumePool()方法之前,让我们先来了解一下连接池的概念。
连接池是一种技术,用于减少数据库连接的创建和销毁,提高应用程序对数据库资源的利用率和性能。
连接池通过预先创建一定数量的数据库连接,将它们放入池中。
当应用程序需要连接数据库时,可以从池中获取连接,并在使用完之后将连接放回池中。
这样可以避免频繁的创建和关闭连接的开销,提高数据库的访问性能。
resumePool()方法是HikariDataSource类中的一个方法,它用于重新启用连接池。
在某些情况下,连接池可能会因为一些原因而处于禁用状态,比如网络故障、数据库中断等。
在这种情况下,应用程序无法从连接池中获取连接,从而导致应用程序无法继续访问数据库。
而resumePool()方法的作用就是重新启用连接池,使得应用程序可以正常地获取和使用数据库连接。
当需要重新启用连接池时,可以调用HikariDataSource类的resumePool()方法。
此方法在内部会重置连接池的状态,并重新初始化连接池。
它会尝试重新建立与数据库的连接,并将这些连接放入连接池中。
一旦连接池被重新启用,应用程序就可以从连接池中获取连接,并继续访问数据库。
需要注意的是,调用resumePool()方法并不是一种常规操作,而是在某些特殊情况下使用的。
通常情况下,连接池会自动检测并重新建立与数据库的连接。
只有在连接池处于禁用状态,并且需要手动恢复连接池时,才需要调用resumePool()方法。
在使用HikariCP连接池时,我们可以通过resumePool()方法来处理一些异常情况,比如网络中断或数据库连接失败。
如果连接池无法正常工作,我们可以尝试调用resumePool()方法重新启用连接池,以确保应用程序能够继续访问数据库。
javaweb期末考试试题和答案# Java Web期末考试试题与答案## 一、选择题(每题2分,共20分)1. 下列哪个不是Java Web开发常用的框架?A. SpringB. HibernateC. StrutsD. Apache Tomcat2. 在Java Web应用中,以下哪个不是Servlet生命周期中的方法?A. init()B. service()C. start()D. destroy()3. 下列关于JSP的描述,哪个是错误的?A. JSP页面可以包含Java代码B. JSP页面最终被转换成ServletC. JSP页面可以直接访问数据库D. JSP页面可以嵌入HTML代码4. 在Java Web中,以下哪个不是MVC模式中的组件?A. ModelB. ViewC. ControllerD. Service5. 下列哪个不是Java Web中常用的数据库连接池?A. Apache DBCPB. C3P0C. HikariCPD. JDBC## 二、简答题(每题10分,共20分)1. 请简述Java Web开发中MVC模式的概念及其优势。
2. 描述Servlet的生命周期,并解释每个阶段的作用。
## 三、编程题(每题15分,共30分)1. 编写一个Servlet,当客户端访问时,返回当前日期和时间。
2. 编写一个JSP页面,使用JSTL标签库显示一个简单的表单,包含用户名和密码输入框,提交按钮,并在提交后通过请求转发到上一个Servlet。
## 四、应用题(每题15分,共30分)1. 描述如何在Java Web应用中实现用户登录功能,并说明所需的主要组件和技术。
2. 描述如何在Java Web应用中实现分页显示数据的功能,并给出一个简单的示例。
## 答案### 一、选择题1. D - Apache Tomcat 是一个Servlet容器,不是框架。
2. C - Servlet生命周期中没有start()方法。
datasource.getconnection的用法-回复datasource.getConnection的用法datasource.getConnection是一个Java方法,用于获取数据库连接。
在Java中,与数据库进行交互通常需要使用到数据库连接,这个方法能够简化我们获取数据库连接的过程。
本文将一步一步回答如何使用datasource.getConnection方法获取数据库连接的过程,并介绍一些常见的用法和注意事项。
1. 引入相关的依赖库首先,在使用datasource.getConnection方法之前,需要确保在项目的依赖中引入了相关的数据库驱动库。
不同的数据库需要使用不同的驱动库,例如MySQL可以使用mysql-connector-java,Oracle可以使用ojdbc 等。
2. 创建数据源对象在获取数据库连接之前,我们需要使用数据源对象对数据库进行配置。
数据源对象是一个连接池,它可以预先创建一定数量的数据库连接,并将这些连接保存在内存中,提供给我们使用。
在Java中,常用的数据源对象有两个:BasicDataSource和ComboPooledDataSource。
在这里我们以BasicDataSource为例:javaimport org.apachemons.dbcp.BasicDataSource;...BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:localhost:3306/mydatabase"); dataSource.setUsername("myusername");dataSource.setPassword("mypassword");在上述代码中,我们首先导入BasicDataSource类,并创建一个BasicDataSource的实例。
什么是BoneCP什么是BoneCPBoneCP 是一个快速、免费而且开源的java数据库连接池(JDBC Pool)管理工具库。
如果你曾经使用过C3P0或者DBCP,那你肯定知道上面这句话的意思;如果你没用过这些,那简单的解释一下,它是一个能为你的应用管理数据库连接的工具。
官方网站:/为什么要学习BoneCP本着不重复发明轮子的原则,不应该在有了C3P0这种成熟的数据库连接池管理工具后再搞个新的出来,但是传说中BoneCP在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右。
不相信?其实我也不怎么信,正找时间自己写测试类测试呢,你也可以去试试看,在这里下载(现在最新版本0.6.7.2,如果你有困难,下面会具体提到在项目中怎么配置)好吧,先看一下官方给出的华丽数据:1. 单线程(1,000,000获得及释放数据库连接请求,连接池大小20-50)2. 多线程(500线程分别获取释放100个链接,连接池大小50-200)3. Prepared Statement (multi-threaded)(500个线程每个100次获得/释放,连接池大小20-500)这里只应用了部分,还有其他比较多的测试数据,有兴趣就去这里瞧瞧吧。
个人还是建议自己写点代码测试一下,那样感受更深啊。
在介绍怎么使用之前,先来看看BoneCP的特性(Features ):•高度可扩展, 快速的连接池. 注:1)不用synchronized 关键字来处理多线程对资源的争用,而是使用java.util.concurrent 包中的锁机制;2)首次使用分区机制来分开管理数据库连接;或许还有其他原因.•Callback (hook interceptor) mechanisms on a change of connection state. •利用分区技术提高性能•允许直接访问一个连接或者语句•智能调整连接池大小•SQL语句缓存支持•支持异步获取数据库连接(通过返回Future<Connection>的形式)•通过释放连接助理进程来释放数据库连接,提高性能.•通过initSQL参数在每次获取连接的时候执行SQL•支持数据库热切换•自动重试失败的数据库操作(当数据库或者网络挂掉的时候)•JMX support•延迟初始化能力(Lazy initialization capable)•自动检测连接可用性(keep-alives 等)•允许直接通过数据源而不是通过驱动来获取一个新的数据库连接(Allow obtaining of new connections via a datasource rather than via a Driver)•Datasource/Hibernate support capable•Debug支持准确地高亮那些已经得到但是还没有关闭的链接(Debugging hooks to highlight the exact place where a connection was obtained but not closed)•Debug支持展示那些被关闭两次的链接地址堆栈信息(Debugging support to show stack locations of connections that were closed twice. )•支持自定义连接池名称.•干净的代码结构,TestCase代码覆盖率达到100% (over 125 JUnit tests).•免费的,开源的而且都是用java干的,最重要的是有很完整的javadocs支持。
Java中常用的数据库连接池
定义
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。
对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。
数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
这项技术能明显提高对数据库操作的性能。
参考资料
DBCP
下载地址:/proper/commons-dbcp/download_dbcp.cgi
相关属性说明: /proper/commons-dbcp/configuration.html
c3p0
下载地址:/projects/c3p0/
相关属性说明: /projects/c3p0/
Druid
下载地址:/maven2/com/alibaba/druid/
相关属性说明: https:///alibaba/druid/wiki
Proxool
下载地址:/
相关属性说明:https:///proxool/proxool
2. 数据库连接池
2.1 原理
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。
使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。
而连接的建立、断开都由连接池自身来管理。
同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
2.2 常见数据库连接池及其特点
在Java中开源的常用的数据库连接池有以下几种:
1)DBCP
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数
据源使用的就是DBCP。
2)c3p0
c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
3)Druid
阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。
支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。
Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor 模式,使得分析SQL的抽象语法树很方便。
简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。
Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。
4) proxool
Proxool是一种Java数据库连接池技术。
sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
目前是和DBCP以及C3P0一起,最为常见的三种JDBC连接池技术。
目前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用Proxool或C3P0。
3. 主要配置说明
连接池配置大体可以分为基本配置、关键配置、性能配置等主要配置,缺少proxool相关配置。
3.1 基本配置
基本配置是指连接池进行数据库连接的四个基本必需配置:
传递给JDBC驱动的用于连接数据库的用户名、密码、URL以及驱动类名。
注:在Druid连接池的配置中,driverClassName可配可不配,如果不配置会根据url自动识别dbType(数据库类型),然后
选择相应的driverClassName。
3.2 关键配置
为了发挥数据库连接池的作用,在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。
无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
最小连接数:
是数据库一直保持的数据库连接数,所以如果应用程序对数据库连接的使用量不大,将有大量的数据库资源被浪费。
初始化连接数:
连接池启动时创建的初始化数据库连接数量。
最大连接数:
是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求被加入到等待队列中。
最大等待时间:
当没有可用连接时,连接池等待连接被归还的最大时间,超过时间则抛出异常,可设置参数为0或者负数使得无限等待(根据不同连接池配置)。
注1:在DBCP连接池的配置中,还有一个maxIdle的属性,表示最大空闲连接数,超过的空闲连接将被释放,默认值为8。
对应的该属性在Druid连接池已不再使用,配置了也没有效果,c3p0连接池则没有对应的属性。
注2:数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。
如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了maxWait,则会报错;如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。
在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。
3.3 性能配置
预缓存设置:
即是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle。
JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。
但由于预缓存的statements属于单个connection而不是整个连接池,所以设置这个
参数需要考虑到多方面的因素。
单个连接拥有的最大缓存数:要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。
在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
连接有效性检测设置:
连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。
如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。
有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。
当然,为了保证绝对的可用性,你也可以使用testOnBorrow 为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。
超时连接关闭设置:
removeAbandoned参数,用来检测到当前使用的连接是否发生了连接泄露,所以在代码内部就假定如果一个连接建立连接的时间很长,则将其认定为泄露,继而强制将其关闭掉。
c3p0重连设置:
设置获取连接失败后,是否重新连接以及间隔时间。