小编Jav*_*cia的帖子

使用Serializable隔离在PostgreSQL 9.2.1中进行谓词锁定

我一直在仔细阅读其他问题中提到的关于事务隔离的postgres文档,但我还没有设法理解"谓词锁定"的东西.

我希望有人能开导我:-)

根据文档:PostgreSQL中的谓词锁与大多数其他数据库系统一样,基于事务实际访问的数据

这听起来不错,那为什么会发生以下情况呢?

CREATE TABLE mycustomer(cid integer PRIMARY KEY, licenses integer);
CREATE TABLE mydevice(id integer PRIMARY KEY, cid integer REFERENCES 
mycustomer (cid), status varchar(10));

INSERT INTO mycustomer(cid, licenses) VALUES (1, 5);
INSERT INTO mycustomer(cid, licenses) VALUES (2, 5);

    Request 1                            Request2
BEGIN TRANSACTION ISOLATION 
LEVEL SERIALIZABLE;
                                         BEGIN TRANSACTION ISOLATION 
                                         LEVEL SERIALIZABLE;
SELECT * from mydevice where cid = 1;

                                         SELECT * from mydevice where cid = 2;
INSERT INTO mydevice(id, cid, status) 
VALUES (1, …
Run Code Online (Sandbox Code Playgroud)

postgresql locking transactions

15
推荐指数
1
解决办法
4044
查看次数

从Java/Spring中检索RabbitMQ队列中未确认消息的数量

有没有办法返回未确认的消息数?

我正在使用此代码来获取队列中的消息数:

DeclareOk declareOk = amqpAdmin.getRabbitTemplate().execute(
        new ChannelCallback<DeclareOk>() {
            public DeclareOk doInRabbit(Channel channel)
                throws Exception {
                return channel.queueDeclarePassive(name);
            }
        });
return declareOk.getMessageCount();
Run Code Online (Sandbox Code Playgroud)

但我想知道未确认消息的数量.

我已经看到RabbitMQ管理工具包含了这些信息(对于每个队列,它给出了Ready/Unacked和Total消息的数量),我想必须有一种从Java/Spring中检索它的方法.

谢谢

UPDATE

Oks,似乎没有办法以编程方式完成,因为配置/队列的列表不是AMPQ的一部分.

可以启用管理插件并查询有关队列的REST Web服务(以及其他内容).更多信息:

http://www.rabbitmq.com/management.html

java spring amqp rabbitmq spring-amqp

8
推荐指数
1
解决办法
5259
查看次数

使用tomcat池和Spring自动重新连接postgres

据我所知,"testOnBorrow"和"validationQuery"参数正好在我的小巷里,但它们似乎没有按预期工作.

我启动应用程序,运行一些查询,一切都很顺利.然后我重新启动postgres服务器 - 无需重启tomcat - 来测试DataSource可以处理重新连接,我得到的就是:

    This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:729)

...

Caused by: org.postgresql.util.PSQLException: This connection has been closed.
    at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.prepareStatement(AbstractJdbc3Connection.java:273)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.prepareStatement(AbstractJdbc2Connection.java:301)
    at sun.reflect.GeneratedMethodAccessor38.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:67)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
    at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:153)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
    at org.apache.tomcat.jdbc.pool.TrapException.invoke(TrapException.java:41)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:99)
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:63)
    at $Proxy35.prepareStatement(Unknown …
Run Code Online (Sandbox Code Playgroud)

postgresql spring connection-pooling

5
推荐指数
1
解决办法
5755
查看次数

Spring-JDBC中的隔离级别SERIALIZABLE

也许有人可以帮我解决Spring(3.1)/ Postgresql(8.4.11)中的事务问题

我的交易服务如下:

@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false)
@Override
public Foo insertObject(Bar bar) {

            // these methods are just examples
            int x = firstDao.getMaxNumberOfAllowedObjects(bar)
            int y = secondDao.getNumerOfExistingObjects(bar)
            // comparison
            if (x - y > 0){
                  secondDao.insertNewObject(...) 
            }
            ....
}
Run Code Online (Sandbox Code Playgroud)

Spring配置Webapp包含:

@Configuration 
@EnableTransactionManagement 
public class ....{
    @Bean
    public DataSource dataSource() {
        org.apache.tomcat.jdbc.pool.DataSource ds = new DataSource();

        ....configuration details

        return ds;
    }

    @Bean
    public DataSourceTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们说请求"x"和请求"y"同时执行并且到达注释"比较"(方法insertObject).然后允许它们都插入一个新对象并提交它们的事务.

为什么我没有RollbackException?据我所知,这是Serializable isolotation级别的用途.回到上一个场景,如果x设法插入一个新对象并提交其事务,则不应该允许"y"的事务提交,因为有一个他没有读过的新对象.

也就是说,如果"y"可以再次读取secondDao.getNumerOfExistingObjects(bar)的值,它将意识到有更多的新对象.幻影?

事务配置似乎工作正常:

  • 对于每个请求,我可以看到firstDao和secondDao的相同连接
  • 每次调用insertObject时都会创建一个事务

第一个和第二个DAO如下: …

java postgresql spring transactions spring-transactions

4
推荐指数
1
解决办法
4647
查看次数