当前位置: 首页 > 面试题库 >

jdbc:oracle数据库更改通知和重复事件

顾泰平
2023-03-14
问题内容

对于Oracle数据库表的任何更改(更新,插入,删除),我都需要一些侦听器。

问题:通过对表进行一次更新,我得到了很多检测。

我认为它的oracle缓存等

是否有可能仅检测到真正的变化?

我的代码:

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dcn.DatabaseChangeEvent;
import oracle.jdbc.dcn.DatabaseChangeListener;
import oracle.jdbc.dcn.DatabaseChangeRegistration;

public class OracleDCN {
    static final String USERNAME = "scott";
    static final String PASSWORD = "tiger";
    static String URL = "jdbc:oracle:thin:@localhost:1521:stingdev";

    public static void main(String[] args) {
        OracleDCN oracleDCN = new OracleDCN();
        try {
            oracleDCN.run();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void run() throws Exception{
        OracleConnection conn = connect();
        Properties prop = new Properties();
        prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS, "true");
        DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);

        try{
            dcr.addListener(new DatabaseChangeListener() {

                public void onDatabaseChangeNotification(DatabaseChangeEvent dce) {
                    System.out.println("Changed row id : "+dce.getTableChangeDescription()[0].getRowChangeDescription()[0].getRowid().stringValue());
                }
            });

            Statement stmt = conn.createStatement();
            ((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);
            ResultSet rs = stmt.executeQuery("select * from EXAMPLE where ID=1");
            while (rs.next()) {
            }
            rs.close();
            stmt.close();
        }catch(SQLException ex){
            if (conn != null)
            {
                conn.unregisterDatabaseChangeNotification(dcr);
                conn.close();
            }
            throw ex;
        }
    }

    OracleConnection connect() throws SQLException {
        OracleDriver dr = new OracleDriver();
        Properties prop = new Properties();
        prop.setProperty("user", OracleDCN.USERNAME);
        prop.setProperty("password", OracleDCN.PASSWORD);
        return (OracleConnection) dr.connect(OracleDCN.URL, prop);
    }
}

输出:

Changed row id : AAAFSzAAAAAAAG8AAA
Changed row id : AAAFSzAAAAAAAG8AAA
Changed row id : AAAFSzAAAAAAAG8AAA
Changed row id : AAAFSzAAAAAAAG8AAA

问题答案:

问题是我多次注册到数据库。解决方案是在注册之前检查注册用户是否有更改事件。

我通过以下查询进行了检查:

select TABLE_NAME 
from USER_CHANGE_NOTIFICATION_REGS


 类似资料:
  • 当用户是管理员角色时,如何更改数据库连接?管理数据库包含其他用户不能访问的信息,并且要求数据库必须位于自己的服务器上。我目前有单独的管理员连接配置。 我想,没有硬编码是在应用中,所以如何可以拉威尔做开关时,必要的?谢谢你的帮助。

  • 问题内容: 我有一个SQL Server数据库,当在表中插入时,我想通知android应用程序。 例如,当收到订单时,我将其插入到SQL Server数据库中。我还希望用户在我的应用中收到有关订单的通知。该应用程序始终处于打开状态。我使用Web服务与数据库联系。 我不想每10秒钟左右请求一次表格。还有其他办法吗? 问题答案: 您可以使用Google Cloud消息服务,在此处了解如何设置服务器。

  • 如何更改mysql数据库密码?

  • 问题内容: 我正在建立一个自助餐厅管理系统,其中有两种类型的用户;客户和柜台所有者。 对于自助餐厅中提供的每道菜,都有一个与之相关的独特的dish.id。 到现在为止,我有一个类似圆顶的东西,例如学生向带有URL的POST请求发送一个带有菜品,标识和计数器编号的POST请求,该URL更新“ orders table”(以PK作为ID)。准备好菜品后,柜台所有者按“已废除” ”按钮。 在这一点上,我

  • 我有以下代码。我想知道修改后的数据帧是否可以从0,1,2开始......等等,就像熊猫上的常规索引一样。 df2现在在哪- 如果我想访问df2在一些常规索引约定从0... n,我不能用这种方法。还有其他方法可以做到吗? 提前感谢。