Apache DBCP连接数据库异常重连

我09年负责的一个项目,有好几组P590小机提供服务,有一次,我们的小机居然集体宕机了,数据库不能服务后,所有的应用自然也没法提供服务。当数据库恢复后,所有的应用的数据库连接也是无效的,当时只有一一重启才生效。而出了问题的数据库,后续又频繁出一些小故障,因为应用的数据库连接是失效的,只能通过后续重启才能提供服务,导致应用又有了进一步的滞后性。因此后续就开始关注数据库重练。

下面这个应用场景,是用DBCP连接本地一个oracle数据库。启动应用后,把数据库关闭,然后又把数据库开启,查看connection是否能正常使用。

package test.ffm83.commons.dbcp;

import org.apache.commons.dbcp.BasicDataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import org.apache.commons.lang.StringUtils;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Connection;

import java.util.Properties;

/* 通过dbcp连接oracle数据库,模拟数据库连接成功后,数据库异常(关闭,宕机等情况)恢复

* 使用1.4版本实现

* @author 范芳铭

* */

public class DbcpErrorConnection {

privatestatic BasicDataSource dataSource = null;

public DbcpErrorConnection(){

}

publicstatic void init() {

if(dataSource != null) {

try{

dataSource.close();

}catch (Exception e) {

e.printStackTrace();

}

dataSource= null;

}

try{

Propertiesp = new Properties();

p.setProperty("driverClassName","oracle.jdbc.driver.OracleDriver");

p.setProperty("url","jdbc:oracle:thin:@127.0.0.1:1522:orcl");

p.setProperty("password","sq");

p.setProperty("username","sq");

p.setProperty("maxActive","6"); //

p.setProperty("maxIdle","3");

p.setProperty("maxWait","10");

p.setProperty("removeAbandoned","true");// 移除不用的连接

p.setProperty("removeAbandonedTimeout","3");

p.setProperty("logAbandoned","true");

p.setProperty("testOnBorrow","true");

p.setProperty("testOnReturn","true");

p.setProperty("testWhileIdle","true");

p.setProperty("validationQuery"," select 1 from dual ");

dataSource= (BasicDataSource) BasicDataSourceFactory

.createDataSource(p);

}catch (Exception e) {

e.printStackTrace();

}

}

publicstatic synchronized Connection getConnection() throws SQLException {

if(dataSource == null) {

init();

}

Connectionconn = null;

if(dataSource != null) {

conn= dataSource.getConnection();

}

returnconn;

}

publicstatic void main(String[] args) throws Exception {

for(int i = 0; i < 20; i++) {

try{

getConAndNotClose(i+ 1); // 在异常放在循环中,不是个好习惯,这里只是为了模拟一些特殊情况

Thread.sleep(8* 1000); // 停顿时间长一点,好停掉数据库

}catch (Exception e) {

e.printStackTrace();

}

}

}

// 本方法使用数据库连接但是不释放,用来模拟连接池溢出情况

privatestatic void getConAndNotClose(int id) throws Exception {

Connectioncon = null;

try{

con= DbcpErrorConnection.getConnection();

Stringsql = " select sysdate from dual ";

PreparedStatementps = con.prepareStatement(sql);

ResultSetrs = ps.executeQuery();

while(rs.next()) {

Stringvalue = rs.getString("sysdate");

System.out.println(StringUtils.center(value+ "," + id

+"数据库连接成功", 50, "-"));

}

}catch (Exception e) {

e.printStackTrace();

}

//注意,这里没有关闭数据库连接池,实际代码不要这么写。

}

}

这些代码都不是正常的代码,在实际工作中,不要这样写。

时间: 2024-11-14 11:56:02

Apache DBCP连接数据库异常重连的相关文章

Apache DBCP数据库连接池溢出调整

数据库最大连接池溢出是在系统运行中比较常见的一个问题,在开发中,可以通过设置最大连接池的各位为1或者2,就能在开发的时候发现数据库连接没有被释放的情况.不过这个小技巧在hibernate和sping等框架大量使用之后就没什么用了. 数据库连接池溢出的源代码: package test.ffm83.commons.dbcp; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.BasicDat

JSP连接数据库异常Context.lookup分析

1.数据库连接访问方式 JSP里面链接数据库操作如下: Context ctx = new InitialContext();  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/bookstore");  Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITI

JDBC DataSource Example – Oracle, MySQL and Apache DBCP Tutorial

We have already seen that JDBC DriverManager can be used to get relational database connections. But when it comes to actual programming, we want more than just connections. Most of the times we are looking for loose coupling for connectivity so that

Visual studio 调试连接数据库异常解决方法

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Data.SqlClient.SqlException: 在

使用Apache DBCP连接池重构DBUtility,让连接数据库更有效,更安全

直接使用JDBC访问数据库时,需要避免以下隐患: 1. 每一次数据操作请求都需要建立数据库连接.打开连接.存取数据和关闭连接等步骤.而建立和打开数据库连接是一件既耗资源又费时的过程,如果频繁发生这种数据库操作,势必会使系统性能下降. 2. 连接对象代表着数据库系统的连接进程,是有限的资源.如果系统的使用用户非常多,有可能超出数据库服务器的承受极限,造成系统的崩溃. 数据库连接池是解决上述问题最常用的方法.所谓连接池,即可以创建并持有数据库连接的组件.连接池可以预先创建并封装一些连接对象并将其缓存

Mysql连接数据库异常汇总【必收藏】

在Centos上部署项目发现一个奇怪的问题,数据库连接一直抛异常.于是花了两个小时搜了各种数据库连接异常导致的原因,最终问题得以解决.同时,把解决过程中搜集到的异常信息汇总一下,当大家遇到类似的问题时,给大家以思路.必须珍藏. 问题现象 先来说说我遇到的问题.项目中遇到的问题很奇怪,在Centos上安装了Mysql数据库,项目使用的是Spring Boot. 项目在本地启动连接服务器数据库正常.本地数据库客户端连接服务器数据库正常.服务器本地连接client连接数据库正常.唯独把项目部署到服务器

关于tomcat启动 报tomcat org.apache.catalina.LifecycleException异常

出现这个异常 tomcat org.apache.catalina.LifecycleException 时,没在意,还以为是数据库配置没配置好,瞎搞了一通.后来从百度上搜了搜,得到了几种答案 一. web.xml没有配置好  转:{               出现这个错误,郁闷了好久,刚开始的时候去网上找了很多,也没有解决,还以为是因为我用的是最新版的tomcat出了问题了,结果后来在看xml的配置时候看到了servlet    的url-pattern的配置少写了一个"/",添加

Apache DBCP总览和常用参数说明等

DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目.由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去. 也是 tomcat.hibernate等开源工具使用的连接池组件. DBCP版本已经整体升级到2.0时代,并且在jar包上做了升级,诸如org.apache.commons.dbcp2.BasicDat

org.apache.catalina.LifecycleException异常的处理

今天调试了很久,重装tomcat都没用,后来发现是xml servlet的url-pattern的配置少写一个"/",添加后启动即可. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext at org.apache.catalina.util.LifecycleBase.sta