首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL在Oracle & MySQL中的XMIN

问PostgreSQL在Oracle & MySQL中的XMIN
EN

Stack Overflow用户
提问于 2017-05-09 04:21:29
回答 2查看 548关注 0票数 1

我正试图在Oracle & MySQL上获得这段代码的等价值

代码语言:javascript
复制
if(vardbtype.equals("POSTGRESQL")){
            Long previousTxId = 0L;
            Long nextTxId = 0L;

            Class.forName("org.postgresql.Driver");
            System.out.println("----------------------------");

            try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/"+ vardbserver, vardbuser, vardbpassword);
                 PreparedStatement stmts = c.prepareStatement("SELECT * FROM "+ vardbname +" where xmin::varchar::bigint > ? and xmin::varchar::bigint < ? ");
                 PreparedStatement max = c.prepareStatement("select max(xmin::varchar::bigint) as txid from "+ vardbname)
                ) {
                c.setAutoCommit(false);

                while(true) {
                    stmts.clearParameters();

                    try(ResultSet rss = max.executeQuery()) {
                        if(rss.next()) {
                            nextTxId = rss.getLong(1);
                        }
                    }
                    stmts.setLong(1, previousTxId);
                    stmts.setLong(2, nextTxId + 1);
                    try(ResultSet rss = stmts.executeQuery()) {
                        while(rss.next()) {
                            String message = rss.getString("MESSAGE");
                            System.out.println("Message = " + message);
                            TextMessage mssg = session.createTextMessage(message);
                            System.out.println("Sent: " + mssg.getText());
                            producer.send(mssg);
                        }
                        previousTxId = nextTxId;
                    }
                    Thread.sleep(batchperiod2);
                }
            }
        }

基本上,代码的工作原理是获取数据库表中的内容并将其发送到ActiveMQ。当表更新时,它将发送刚刚更新的内容(而不是发送过去发送的内容)。但此代码仅适用于PostgreSQL。

然后我计划创建一个"if“函数。因此,我可以使用另一个数据库来获取数据(Oracle和MySQL)。

我想我必须修改这个代码,对吗?

代码语言:javascript
复制
 try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/"+ vardbserver, vardbuser, vardbpassword);
             PreparedStatement stmts = c.prepareStatement("SELECT * FROM "+ vardbname +" where xmin::varchar::bigint > ? and xmin::varchar::bigint < ? ");
             PreparedStatement max = c.prepareStatement("select max(xmin::varchar::bigint) as txid from "+ vardbname)
            ) {
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-09 07:36:37

几个想法补充了托斯滕的答案。

首先,xmin是一个系统列,iirc存储在磁盘上的行头中。它是通过写更新的。我还没有遇到事务id没有增加的情况。然而,必须有一些概括点。我认为最好使用触发器将事务in存储在另一个表中,以便为此进行处理(并使用该触发器处理事物)。

对于甲骨文和MySQL,底层存储有很大的不同,所以我看不出你怎么能直接做到这一点。

如果您想要一个通用的解决方案,您需要一个队列表,其中可以使用触发器插入等待的副本,然后在员工中选择/删除。这在MySQL上可能比在PostgreSQL上工作得更好,对于甲骨文来说,您想要寻找面向索引的表。如果自动真空系统跟不上进度,请多问几个问题或聘请一位顾问。

进一步研究后的

InnoDB提供了一个类似的DB_TRX_ID列。注意,如果您运行的是MySQL,您不能假设您有这个列,因为MySQL有不同的表存储引擎,甚至不是所有的事务都支持。这是一个重要的限制。

我无法在Oracle上找到类似的列。

票数 3
EN

Stack Overflow用户

发布于 2017-05-09 06:11:23

这个脚本是在表中查找间隔,并输出自上次循环以来插入的所有消息。

PostgreSQL存储插入记录的事务号,因此可以用来查找新插入的记录(但我不确定是否像脚本所假设的那样,新事务的数量比以前的所有事务都高)。

其他DBMS没有这个伪列。因此,您必须在表中有一个时间戳列,然后使用它。您必须更改这两个查询以及匹配数据类型的代码(我认为是java.sql.Timestamp而不是Long,但我不是Java )。

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

https://stackoverflow.com/questions/43861075

复制
相关文章

相似问题

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