0

我有一个与数据库服务器通信的 Java 应用程序。自动提交模式需要设置为 false,因此有一个每秒执行一次提交的计划任务:

如果我的应用程序暂时无法访问此类服务器,我会尽量避免数据丢失。

    Connection stableConn = ...;
    stableConn.setAutoCommit(false);

    //create the task to commit changes every second:
    commitTask = new Timer("CommitOnDB");
    commitTask.schedule(new TimerTask() {
        @Override
        public void run() {
            boolean exit = false;

            //if the connection to DB is lost, loop until it is re-established:
            while(!exit) {
                try {
                    stableConn.commit();    
                    exit = true;
                } catch (SQLException e) {
                    exit = !"08007".equals(e.getSQLState());
                    log.error("Cannot commit statements due to " + e + ";state=" + e.getSQLState(), e);
                }
            }
        }
    }, 1000, 1000);

当连接断开时,我试图捕获 08007 SQLState,但无论如何,在循环的第二轮,我得到另一个异常,说明连接已经关闭。

此外,我想要一个适用于不同 DBMS 的代码,如 MS SQL Server、MySQL、Oracle 等。

谁能指出我正确的方向?

4

1 回答 1

0

添加一些这样的检查:

if(stableConn.isClosed()) {
    stableConn = getRecoveredConnection();
} 

或者

if(!SomeHelper.isValid(connection)) {
   ... 
}

实际上,您甚至最好在 catch 或 finally 中执行此操作,因为某些 SQL 异常只是告诉您数据库不喜欢您的操作,而其他(如您的情况)使会话无效。

于 2013-01-21T19:55:37.247 回答