- 浏览: 31053 次
文章分类
最新评论
前提:DBPool连接池自身有数据库断连后获取重连的机制
问题:执行某条sql时连接断开,此时此条sql不会被执行,并且若不进行特殊处理,程序会继续往下执行,
此时会出现数据丢失现象。
解决思路:1、判断是否是因为连接被断开引起的异常
2、若是连接被断开引发的异常,则循环持续等直到重新获得连接
3、重新获得连接后,先执行报错时执行的sql
4、接着往下执行原程序流程
package com.info.db.common;
import java.sql.Connection;
import java.sql.SQLException;
import com.info.db.DbHelper;
import com.info.db.DbOperate;
import com.info.log.SysLog;
/ **
* @description 测试连接池是否能自动重连接
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
* @since 1.0
*/
public class ConnectionPoolUtil {
private DbOperate operate;
private long second;
/ **
* 初始方法
*
* @param operate
* 数据库操作对象
* @param second
* 重连等待时间
*/
public ConnectionPoolUtil(DbOperate operate, long second) {
this.operate = operate;
this.second = second;
}
/ **
* 处理数据库断连引发的问题
*
* @description
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
* @param sql
* 异常产生时执行的sql,保证数据完整性
*/
public boolean ConncetionHandle(String sql) {
boolean result = ConncetionHandle(); // true为sql异常
// 数据库重连后继续执行原有sql
if ( !result) {
try {
operate.execute(sql);
} catch (Exception e) {
SysLog.error(sql);
}
} else {
SysLog.error(sql);
}
return result;
}
/ **
* 处理数据库断连引发的问题
*
* @description
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
*/
public boolean ConncetionHandle() {
Connection connetion = null;
long time = second * 1000; // 单位为毫秒
boolean flag = true; // 判断是否正常,默认为连接池是连接的
// 判断是sql语句异常还是断连引发的异常
boolean result = false;
try {
connetion = operate.getDefaultPool().openConnection();
if (connetion == null) {
result = false;
} else {
result = true;
}
operate.getDefaultPool().closeConnection(connetion);
} catch (SQLException e) {
result = false;
}
if ( !result) {
SysLog.error("Connect DataBase Failed,Please contact Administrator!");
//SysLog.error("数据库连接已经断开,请检查数据库服务器!");
// 循环重连
do {
try {
connetion = operate.getDefaultPool().openConnection();
if (connetion == null) {
flag = false;
} else {
flag = true;
}
operate.getDefaultPool().closeConnection(connetion);
} catch (SQLException e) {
flag = false;
}
if ( !flag) {
try {
Thread.sleep(time); // 连接断开时给他延时time时间
} catch (InterruptedException e) {
SysLog.error(e.getMessage());
}
}
} while ( !flag);
SysLog.error("Connect DataBase Success!");
// SysLog.error("数据库连接已恢复!");
}
return result;
}
public static void main(String[] args) {
ConnectionPoolUtil testConnectionPool = new ConnectionPoolUtil(
DbHelper.getOperator("bas"), 5);
testConnectionPool.add();
}
private void add() { // 测试方法
for (int i = 0; i < 1000; i++ ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
String sql = "INSERT INTO test ([name],[date],[intsum]) VALUES "
+ "('name" + i + "',NULL," + i + ")";
SysLog.info(sql);
try {
operate.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
ConncetionHandle(sql);
}
}
}
}
问题:执行某条sql时连接断开,此时此条sql不会被执行,并且若不进行特殊处理,程序会继续往下执行,
此时会出现数据丢失现象。
解决思路:1、判断是否是因为连接被断开引起的异常
2、若是连接被断开引发的异常,则循环持续等直到重新获得连接
3、重新获得连接后,先执行报错时执行的sql
4、接着往下执行原程序流程
package com.info.db.common;
import java.sql.Connection;
import java.sql.SQLException;
import com.info.db.DbHelper;
import com.info.db.DbOperate;
import com.info.log.SysLog;
/ **
* @description 测试连接池是否能自动重连接
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
* @since 1.0
*/
public class ConnectionPoolUtil {
private DbOperate operate;
private long second;
/ **
* 初始方法
*
* @param operate
* 数据库操作对象
* @param second
* 重连等待时间
*/
public ConnectionPoolUtil(DbOperate operate, long second) {
this.operate = operate;
this.second = second;
}
/ **
* 处理数据库断连引发的问题
*
* @description
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
* @param sql
* 异常产生时执行的sql,保证数据完整性
*/
public boolean ConncetionHandle(String sql) {
boolean result = ConncetionHandle(); // true为sql异常
// 数据库重连后继续执行原有sql
if ( !result) {
try {
operate.execute(sql);
} catch (Exception e) {
SysLog.error(sql);
}
} else {
SysLog.error(sql);
}
return result;
}
/ **
* 处理数据库断连引发的问题
*
* @description
* @author xiaoxiong
* @date 2012-10-23
* @version 1.0.0
*/
public boolean ConncetionHandle() {
Connection connetion = null;
long time = second * 1000; // 单位为毫秒
boolean flag = true; // 判断是否正常,默认为连接池是连接的
// 判断是sql语句异常还是断连引发的异常
boolean result = false;
try {
connetion = operate.getDefaultPool().openConnection();
if (connetion == null) {
result = false;
} else {
result = true;
}
operate.getDefaultPool().closeConnection(connetion);
} catch (SQLException e) {
result = false;
}
if ( !result) {
SysLog.error("Connect DataBase Failed,Please contact Administrator!");
//SysLog.error("数据库连接已经断开,请检查数据库服务器!");
// 循环重连
do {
try {
connetion = operate.getDefaultPool().openConnection();
if (connetion == null) {
flag = false;
} else {
flag = true;
}
operate.getDefaultPool().closeConnection(connetion);
} catch (SQLException e) {
flag = false;
}
if ( !flag) {
try {
Thread.sleep(time); // 连接断开时给他延时time时间
} catch (InterruptedException e) {
SysLog.error(e.getMessage());
}
}
} while ( !flag);
SysLog.error("Connect DataBase Success!");
// SysLog.error("数据库连接已恢复!");
}
return result;
}
public static void main(String[] args) {
ConnectionPoolUtil testConnectionPool = new ConnectionPoolUtil(
DbHelper.getOperator("bas"), 5);
testConnectionPool.add();
}
private void add() { // 测试方法
for (int i = 0; i < 1000; i++ ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
String sql = "INSERT INTO test ([name],[date],[intsum]) VALUES "
+ "('name" + i + "',NULL," + i + ")";
SysLog.info(sql);
try {
operate.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
ConncetionHandle(sql);
}
}
}
}
发表评论
-
java调用linux shell脚本分割文件
2014-03-02 11:27 0java代码: public void splitFile( ... -
java获取文件最后一行和第一行记录
2014-03-02 11:24 2886/ ** * * @description ... -
java可序列化Object到XML文件中
2014-03-02 11:20 579package com.ftpgw; import java ... -
sql server2005 bcp导入导出
2014-03-02 11:10 511导出192.168.1.112服务器bas数据库TestTab ... -
java代码中对溢出数据的处理
2014-03-02 10:58 1441例如:获取6.00999999999的值保留两位 B ... -
Java集合类库
2013-05-13 19:42 943http://jiangzhengjun.iteye.com/ ... -
框架搭建方案
2013-05-13 15:43 689表示层:Extjs 3.4 + freemarker ... -
java技术重点汇总
2013-05-09 09:02 750java技术面试体汇总: • struts2和struts1有 ... -
Java 程序优化的一些最佳实践
2013-05-07 10:28 572http://www.iteye.com/news/27673 ... -
双机热备与负载均衡区别
2013-04-25 10:49 855谁能说说双机热备份是怎么实现的,原理是什么~ 我一直搞不清楚 ... -
微软群集MSCS系统介绍
2013-04-25 10:40 8511. 微软群集MSCS系统介绍 群集服务器是一组独立的服务器, ... -
sqlserver 数据库集群与热备
2013-04-24 21:58 1688MS SQL Server数据库服务器可以说是应用范围最广的数 ...
相关推荐
SQL只用到一种连接方式,而Oracle用到了ADO和OO4O(部分功能尚未完成), 支持SQL语句执行(支持SQL Server和Oracle语法,并支持关键字高亮)支持导出数据库表结构为SQL脚本.... 连接Oracle服务器需要安装OO40组件,...
E-R实体-联系模型 基于对象的数据模型 半结构化数据模型 1.4 数据库语⾔ DDL定义数据库模式,以及数据库操纵语⾔(DML)来表达数据库查询和更新 DDL的⼀些⼀致性约束:域约束、参照完整性、断⾔、授权。DDL的输出...
后会发现数据库中有很多这样的进程: 那么造成sleep的原因,有三个,下面是mysql手册给出的解释: 1.客户端程序在退出之前没有调用mysql_close().[写程序的疏忽,或者数据库的db类库没有自动关闭每次的连接。。。] 2...
断发展的Java项目需要精通Java数据库连接,MySQL,HTTP和JSpring框架。你应该学习Spring核心/ MVC,ORM框架和Hibernate来完成这个项目。您将为网络平台开发一个管理系统,让社区管理人员修改和访问消费者数据,以...
分析了J 2EE与企业数据库之间的接口连接问题 ,最后结合实际情况 ,给出了一个银行企业信息系 统的设计方案,并讨论了系统代码实现的关键技术问题。该系统具有可伸缩性好、 易维护、 使用灵 活等特点。 科学技术的...
而pDBFat是数据库的起始地址,如果pSysHead->dbf_count值异常过大,将导致pDBFat值超过最大内存地址值,随后进行的内存操作将导致内存操作越界错误,因而在测试过程中数据库破坏后就出现了主机死机的现象。...
Dijkstra算法运行在LS数据库上来获得每个被通告路由的最佳路径。 debug isis update-packets debug isis snp-packets 以上两个调试帮助故障排除LSP洪泛问题和链路状态数据库同步。 路由没有到达网络远...
如果你能记起以前问题的细节和怎么解决它的,你就可以复用以前的经验而不需要重新发现它。然而,我们 并没有很好记录下可供他人使用的软件设计经验。 学习 GoF设计模式的重要性 著名的 EJB 领域顶尖的专家 Richard...
断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则不会进入主窗口,整个程 序结束运行 } 主函数必须这么写,...
子程序 到短路径, 文本型, 公开, 取指定路径的短路径名(返回收缩后的路径,无效返回空文本)如: c:\program files\ 收缩后为:C:\PROGRA~1\ .参数 文件名, 文本型, , 原路径 .子程序 到任意进制, 文本型, 公开, 可以将...
剪断相交线:选择线剪断相交线或者直接拉一条线剪断相交线,自相交及节点断线。 等分线:定距离或定段数等分一条线。还可以随机按偏移量自动等分线。 图元筛选:根据参数或者属性筛选图元,还可选择相同的图元。 ...