package com.data.dbcp;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
/**
* DBCP使用的连接方法 需要用到的jar包有 commons-pool-1.4.jar commons-dbcp-1.2.2.jar
* commons-collections-3.2.1.jar
*
* 2. dbcp的基本配置
*
* 相关配置说明:
*
*
*
* initialSize :连接池启动时创建的初始化连接数量(默认值为0) maxActive
* :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
* maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放
* ,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数
* 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
* minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接
* (默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的
* ;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置) maxWait
* :最大等待时间,当没有可用连接时
* ,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用
* ,而导致请求被无限制挂起)
* poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
* maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
* minEvictableIdleTimeMillis :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
* (默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关) removeAbandonedTimeout
* :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180) removeAbandoned
* :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)
*
*
* removeAbandoned参数解释: 如果开启了removeAbandoned,当getNumIdle() < 2) and
* (getNumActive() > getMaxActive() - 3)时被触发. 举例当maxActive=20,
* 活动连接为18,空闲连接为1时可以触发"removeAbandoned".但是活动连接只有在没有被使用的时间超
* 过"removeAbandonedTimeout"时才被回收 logAbandoned: 标记当连接被回收时是否打印程序的stack
* traces日志(默认为false,未调整)
*
*
* 一般会是几种情况出现需要removeAbandoned: 代码未在finally释放connection
* , 不过我们都用sqlmapClientTemplate,底层都有链接释放的过程
* 遇到数据库死锁。以前遇到过后端存储过程做了锁表操作,导致前台集群中连接池全都被block住,后续的业务处理因为拿不到链接所有都处理失败了。
*
*
* @author bowei.hu
*
*/
public class DbcpConnection {
private static DataSource dataSource;
private static Connection con;
public DbcpConnection() {
}
public static Connection getConnection() {
if (dataSource == null) {
initDataSource();
}
try {
con = dataSource.getConnection();
print();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
public static void initDataSource() {
FileInputStream is = null;
Properties p = new Properties();
String driverClassName = null;
String url = null;
String username = null;
String password = null;
int initialSize = 0;
int minIdle = 0;
int maxIdle = 0;
int maxWait = 0;
int maxActive = 0;
try {
String path = DbcpConnection.class.getClass().getResource("/")
.getPath();
is = new FileInputStream(path + "dbcp.properties");
p.load(is);
driverClassName = p.getProperty("dbcp.driverClassName");
url = p.getProperty("dbcp.url");
username = p.getProperty("dbcp.username");
password = p.getProperty("dbcp.password");
initialSize = Integer.parseInt(p.getProperty("dbcp.initialSize"));
minIdle = Integer.parseInt(p.getProperty("dbcp.minIdle"));
maxIdle = Integer.parseInt(p.getProperty("dbcp.maxIdle"));
maxWait = Integer.parseInt(p.getProperty("dbcp.maxWait"));
maxActive = Integer.parseInt(p.getProperty("dbcp.maxActive"));
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
BasicDataSource ds = new BasicDataSource();
ds.setUrl(url);
ds.setDriverClassName(driverClassName);
ds.setUsername(username);
ds.setPassword(password);
ds.setInitialSize(initialSize); // 初始的连接数;
ds.setMaxActive(maxActive);
ds.setMinIdle(minIdle);
ds.setMaxIdle(maxIdle);
ds.setMaxWait(maxWait);
// ds.setRemoveAbandoned(true);
// ds.setRemoveAbandonedTimeout(2000);
dataSource = ds;
}
/* 用于测试连接状态的方法 */
public static void print() {
BasicDataSource ds = (BasicDataSource) dataSource;
System.out.println(ds.getInitialSize());
System.out.println(ds.getNumActive());
System.out.println(ds.getNumIdle());
System.out.println(ds.getDefaultAutoCommit());
}
public static void main(String[] args) {
Connection con;
try {
con = DbcpConnection.getConnection();
print();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from org_user");
while (rs.next()) {
System.out.print("Number:"
+ rs.getString("FIRST_NAME").toString());
System.out.println();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
---------------------------------------------------------
位于src目录下的dbcp.properties 配置文件
dbcp.driverClassName=oracle.jdbc.driver.OracleDriver
dbcp.url=jdbc:oracle:thin:@127.0.0.1:1521:数据库
dbcp.username=帐号
dbcp.password=密码
dbcp.initialSize=10
dbcp.minIdle=5
dbcp.maxIdle=15
dbcp.maxWait=3000
dbcp.maxActive=20
分享到:
相关推荐
总之,DBCP Demo Java项目就是演示如何在Java应用程序中集成和使用DBCP连接池来管理MySQL数据库的连接。通过这种方式,可以有效地管理数据库连接,提高应用性能,同时降低系统的资源消耗。在实际开发中,可以根据...
c3p0提供了许多高级特性,比如自动测试连接、空闲连接检测、连接池大小动态调整等。相比于DBCP,c3p0在连接管理上更为灵活,且具有更好的异常处理机制。 **Tomcat 数据源** Tomcat作为一款流行的Java Web服务器,...
C3P0提供了一些高级特性,如连接测试、空闲连接检测、自动关闭长时间未使用的连接等。配置灵活,但相比其他连接池,C3P0的性能稍弱,适合对性能要求不那么高的场景。 4. **JdbcUtilDBCP**:DBCP(BasicDataSource)...
**Spring3整合Hibernate4测试Demo** 在Java Web开发中,Spring和Hibernate是两个非常重要的框架。Spring是一个全面的后端应用程序框架,它提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)以及其他...
在实际开发中,虽然手写数据库连接池可以加深对数据库连接池原理的理解,但更常见的情况是使用成熟的连接池实现,如C3P0、Apache DBCP、HikariCP等,它们经过大量优化,提供了更好的性能和稳定性。 总的来说,理解...
12. **dass-demo项目**:此项目可能是一个示例或者测试项目,专门用来演示如何在Java应用中使用JDBC进行数据库操作,以便学习或验证数据库连接和查询功能。 通过上述步骤和知识点,我们可以理解“dass-demo jdbc...
标签“for jdbc MySql 测试demo”进一步明确了这是个针对JDBC和MySQL的测试示例,可能包括创建数据库连接、执行SQL语句、处理结果集等基本操作。 在压缩包文件名称列表中,只有一个名为“TestMySql”的文件或目录。...
常见的Java连接池有HikariCP、C3P0、Apache DBCP等。 2. **Servlet与JSP**:Java登录Demo可能使用了Servlet来处理HTTP请求,Servlet是Java标准API的一部分,用于扩展服务器功能。登录请求通常由Servlet接收,处理...
1. **数据库连接池**:例如使用Apache的DBCP或C3P0,它们能够有效地管理数据库连接,提高系统的性能。 2. **DAO(Data Access Object)层**:这是处理数据库操作的接口和实现类,通过Hibernate提供的Session接口进行...
4. **运行和测试**:最后,你可以运行`JDBCDemo`类,检查是否能成功连接到数据库并执行SQL查询。如果一切配置正确,程序应该能够打印出表`mytable`中的数据。 总结来说,Eclipse和MySQL的数据库连接池配置涉及JDBC...
9. **DBCP数据库连接池**:dbcpdemo展示了DBCP(Database Connection Pool)的使用,这是Apache提供的另一个数据库连接池实现。 10. **Disruptor并发框架**:disruptor3demo使用了LMAX Disruptor,这是一个高性能...
在这个Demo中,"SqlServerAndroidTest2"可能是主程序或者测试代码,它演示了上述步骤的具体实现。开发者可能需要调试这个代码,查看如何正确配置URL,以及如何处理可能出现的网络延迟和异常情况。 值得注意的是,...
可以使用Apache Commons DBCP或HikariCP等连接池库来提高性能。 ```java @Bean("dataSource1") public DataSource dataSource1() { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql...
5. 数据库连接与事务管理:配置数据源,如Druid或Apache DBCP,以及Spring的事务管理,确保数据操作的原子性、一致性。 6. 编写Controller:基于SpringMVC的Controller,处理HTTP请求,调用Service层进行业务逻辑...
通过这种方式,开发者可以将业务逻辑与数据访问层进行分离,提高代码的可维护性和可测试性。下面将详细介绍这两个组件以及如何在实际项目中使用它们。 首先,SpringMVC提供了控制器(Controller)、模型(Model)、...
相比其他连接池,如HikariCP、DBCP等,Druid提供了更全面的监控、性能优化和扩展点,如SQL解析、 DruidStatViewServlet(监控页面)、过滤器(如wall-filter,防止SQL注入)等。在这个项目中,Druid1.0.2被用作数据...
- **DBCP连接池**:使用Apache DBCP作为数据库连接池。 **4. 配置MyBatis** - **配置文件**:在`resources`目录下创建`mybatis-config.xml`文件,配置数据库连接参数、别名等。 - **Mapper接口和XML映射文件**...
【连接池的入门】 连接池是数据库操作中的一个重要概念,它的出现极大提升...在实际应用中,我们通常会使用成熟的连接池库,如Apache的DBCP或C3P0,这些库提供了更完善的管理和监控功能,确保了连接池的稳定性和性能。
7. **连接池**:为了提高性能和资源利用率,生产环境中通常会使用连接池,如HikariCP、C3P0或Apache DBCP等。这些连接池库可以与Spring集成,实现高效的数据源管理。 8. **JdbcTemplate和...