首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java - Oracle数据库更改通知

Java - Oracle数据库更改通知
EN

Stack Overflow用户
提问于 2014-11-18 21:37:46
回答 1查看 8.2K关注 0票数 5

我正在尝试实现一个事件侦听器,它可以识别数据库更改通知 (Oracle)。据参考网站称,当示例表中的某些内容发生变化时,该事件将触发并打印ROW_ID。我想要这个项目运行,它应该给我一个信息“给我一些东西!”如果我手动在数据库中插入/更新数据。但是,我的理解是,无论发生什么,这段代码都将终止,因为没有无限循环可以被事件中断。如果我错了,请纠正我。

附加问题]

通过将OracleConnection.DCN_NOTIFY_ROWIDS设置为true,它将通知每个事件,包括插入、更新、删除。我说的对吗?我混淆了的含义“数据库更改事件将包括行级别的详细信息,例如操作类型和ROWID"

我的代码:

代码语言:javascript
复制
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 DBTest {
    static final String USERNAME = "username";
    static final String PASSWORD = "password";
    static String URL = "jdbc:oracle:thin:@url:port/name";

    public static void main(String[] args) {
        DBTest oracleDCN = new DBTest();
        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("GIVE ME SOMETHING!");
                }
            });
            //conn.unregisterDatabaseChangeNotification(dcr);
            Statement stmt = conn.createStatement();
            ((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);
            ResultSet rs = stmt.executeQuery("select * from Schema.T_TEST");
            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", DBTest.USERNAME);
        prop.setProperty("password", DBTest.PASSWORD);
        return (OracleConnection) dr.connect(DBTest.URL, prop);
    }
}

更多详细信息可以在参考网站中找到。

EN

回答 1

Stack Overflow用户

发布于 2017-07-12 15:02:38

正如您所猜测的,您需要使主线程保持活动状态,否则程序将退出。你可以让它睡觉或者做一些更有用的事情。此外,您可以关闭JDBC连接,但不希望立即关闭(注销)注册。数据库更改通知的工作方式是使用在驱动程序中运行的内部侦听线程。此侦听线程将接收服务器通过专用网络套接字发送的带外事件,处理这些事件并通知侦听器。如果取消注册,此侦听线程将被关闭。当您对接收这些事件不再感兴趣时,您可以创建到数据库的另一个连接以取消注册,这将最终关闭驱动程序的侦听线程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27004545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档