我正试图在Oracle & MySQL上获得这段代码的等价值
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)。
我想我必须修改这个代码,对吗?
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)
) {发布于 2017-05-09 07:36:37
几个想法补充了托斯滕的答案。
首先,xmin是一个系统列,iirc存储在磁盘上的行头中。它是通过写更新的。我还没有遇到事务id没有增加的情况。然而,必须有一些概括点。我认为最好使用触发器将事务in存储在另一个表中,以便为此进行处理(并使用该触发器处理事物)。
对于甲骨文和MySQL,底层存储有很大的不同,所以我看不出你怎么能直接做到这一点。
如果您想要一个通用的解决方案,您需要一个队列表,其中可以使用触发器插入等待的副本,然后在员工中选择/删除。这在MySQL上可能比在PostgreSQL上工作得更好,对于甲骨文来说,您想要寻找面向索引的表。如果自动真空系统跟不上进度,请多问几个问题或聘请一位顾问。
进一步研究后的
InnoDB提供了一个类似的DB_TRX_ID列。注意,如果您运行的是MySQL,您不能假设您有这个列,因为MySQL有不同的表存储引擎,甚至不是所有的事务都支持。这是一个重要的限制。
我无法在Oracle上找到类似的列。
发布于 2017-05-09 06:11:23
这个脚本是在表中查找间隔,并输出自上次循环以来插入的所有消息。
PostgreSQL存储插入记录的事务号,因此可以用来查找新插入的记录(但我不确定是否像脚本所假设的那样,新事务的数量比以前的所有事务都高)。
其他DBMS没有这个伪列。因此,您必须在表中有一个时间戳列,然后使用它。您必须更改这两个查询以及匹配数据类型的代码(我认为是java.sql.Timestamp而不是Long,但我不是Java )。
https://stackoverflow.com/questions/43861075
复制相似问题