H2数据库很小巧,我在几个项目是使用过,感觉还不错。
这几天遇到一个奇怪的问题,使用H2自带的连接池,经常出现从连接池是获取连接不成功,程序阻塞的情况。代码很简单,官方网站上对连接池的使用也语焉不详。
JdbcConnectionPool pool = JdbcConnectionPool.create(url, username, password);
pool.setLoginTimeout(Integer.parseInt(100000));// 建立连接超时时间
pool.setMaxConnections(Integer.parseInt(100));// 建立连接最大个数
Connection conn = pool.getConnection();
没有办法,看了看源码,发现获取连接时,如果没有可用连接,就差不多是一个死循环。
public Connection getConnection() throws SQLException {
long max = System.currentTimeMillis() + timeout * 1000;
do {
synchronized (this) {
if (activeConnections < maxConnections) {
return getConnectionNow();
}
try {
wait(1000);
} catch (InterruptedException e) {
// ignore
}
}
} while (System.currentTimeMillis() <= max);
throw new SQLException("Login timeout", "08001", 8001);
}
看代码,建立连接超时时间的单位应该是秒,我按毫秒设的,结果造成程序的阻塞。阻塞的原因找到了,但连接池中连接数量过多也是一个问题,理论上应该不会过多。
想了想,H2的连接池似乎没有设置连接的最大存活时间,如果程序编写有问题,导致经常出现连接没有正常关闭,可能会导致很多无效的连接一直存活,当占满连接池的时候,就会无法获取有效的连接。
以上为我的猜测,不确定是否正确。
决定不再使用H2自带的连接池,改用原来一直使用的Proxool连接池。观察一段时间,再看能否解决问题。
另:java的连接池技术好像好多年都没有什么发展了,有些奇怪,难道连接池技术已经发展完备了,没有再发展的余地了吗?可能是这样。
分享到:
相关推荐
2. DBCP(Apache BasicDataSource):Apache的一个基础数据库连接池实现,基于Jakarta-pool,它是Tomcat等服务器默认的连接池。 3. HikariCP:一款高性能的数据库连接池,它的设计目标是提供最小的资源消耗和最快的...
支持常见的Java连接池如C3P0、DBCP、HikariCP等,可以提高数据库连接的复用率,提升系统性能。 10. **测试工具** 对于测试和开发,H2可以快速创建和销毁数据库,为单元测试和集成测试提供便利。 总之,H2数据库...
在Spring Boot应用中,你可以通过@Autowired注解注入DataSource,然后使用它来获取数据库连接。以下是一个简单的示例: ```java package springbootguides.datasourceconfig; import org.springframework.beans....
此外,使用连接池(如C3P0、HikariCP或Apache DBCP)可以有效地管理数据库连接,提高性能和资源利用率。 总结,JDBC作为Java访问数据库的标准,使得开发者无需关心底层数据库的差异,只需关注SQL语句和业务逻辑。...
连接池预先初始化一定数量的数据库连接,供多个线程共享,避免了频繁的创建和关闭连接。 总之,JDBC提供了一种统一的方式来访问各种数据库,而这个压缩包提供的jar文件是实现这一目标的基础。正确地使用这些驱动和...
10. **优化连接池**: 在实际生产环境中,通常会使用连接池(如C3P0、HikariCP、Apache DBCP等)来管理和复用数据库连接,提高性能和资源利用率。 了解以上知识点后,你可以根据具体需求选择对应的JDBC驱动jar包,...
此外,API还包括了事务管理、连接池、存储过程等功能,以满足复杂的应用需求。 **用户指南** 用户指南是H2DB的重要资源,它详细阐述了如何安装、配置和使用H2数据库。在指南中,你可以找到关于启动数据库服务器、...
创建一个连接池或者直接连接都可以,如下所示: ```java Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:./mydatabase", "sa", ""); ``` 这里的`./mydatabase`是数据库的...
阿里Druid是一个强大的Java数据库连接池组件,由阿里巴巴开源并维护。在1.2.6版本中,Druid提供了一套高效、灵活且稳定的数据库连接管理解决方案,适用于各种Java Web应用和企业级系统。该jar包是Druid的核心库,...
### Tomcat 6.0 使用 JDBC 连接池连接 MySQL 操作步骤详解 #### 一、环境搭建 在正式开始之前,确保您的计算机上已经安装了以下组件: 1. **JDK**: Java Development Kit(Java 开发工具包),本文档采用的是 JDK...
在Java编程中,JDBC(Java Database Connectivity)是一个核心API,用于与各种类型的数据库进行交互。它提供了一种标准的方法,让Java开发者...此外,使用连接池(如C3P0, HikariCP等)可以提高性能并优化资源管理。
Nacos默认使用H2数据库进行存储,但为了满足大规模生产环境的需求,通常会选择更为强大的数据库系统,如MySQL或Oracle。对于Oracle 11g,我们需要确保已安装并正确配置了Oracle数据库服务,同时在Nacos的配置文件中...
它提供了诸如连接池、事务管理和SQL查询等特性,同时保持与H2数据库的所有功能兼容。 5. **使用R2DBC-H2** 要使用R2DBC-H2,首先需要在项目中添加对应的依赖。然后,可以通过创建R2DBC连接工厂来建立数据库连接,...
2. **数据源的概念**:数据源是存储和管理数据库连接的对象,它在应用和底层数据库之间提供了一个接口,用于创建、获取和管理数据库连接。 3. **Spring中的数据源类型**:Spring支持多种数据源实现,如...
- 配置与连接:在Java项目中,需要添加MySQL JDBC驱动依赖,配置数据库连接池,如HikariCP或Apache DBCP,然后通过JDBC API进行数据库操作。 4. **数据库连接管理**:在Java应用中,通常使用数据库连接池来管理和...
- 使用连接池管理数据库连接,如C3P0、HikariCP或Apache DBCP,提高性能和资源利用率。 - 用`PreparedStatement`代替`Statement`防止SQL注入攻击。 - 在测试环境中,考虑使用内存数据库如H2,以减少测试依赖。 ...
3. 德鲁伊(Druid):Druid是一个高性能、灵活的数据库连接池。它提供监控、扩展性、连接池管理等功能。在SpringBoot项目中,Druid通常作为数据源,用于管理和优化数据库连接,提高系统性能。 4. 分片-JDBC...
在本文中,我们将深入探讨如何使用JBuilder 2005这一强大的集成开发环境来构建Web应用程序,特别是在Tomcat服务器上实现数据库连接池Database Connection Pool (DBCP) 的过程。JBuilder是一个支持多种Java开发工具的...
数据源动态配置MYSQL,ORACLE数据库连接进行入池。 系统管理-系统设置中数据源选项控制是否项目启动时进行加载数据源。 项目启动时加载连接数据源确保网络通畅,手动加载需每次项目启动后手动进行加载。手动加载可避免...
- **数据库连接** - 要解决WSUS数据库连接问题,需要使用管理员账户登录,并通过正确的管道路径连接到SQL Server实例。 - 对于Windows Server 2008,使用路径:`\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query` - ...