使用Spring MVC / Hibernate'大对象的POSTGRESQL错误可能无法在自动提交模式下使用'

时间:2011-10-10 19:53:28

标签: hibernate postgresql

当然,对于Here,这个似乎很容易,但我在应用程序上下文中添加了以下内容......

<property name="dataSource">
    <ref bean="dataSource"/>
</property>

<property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.autocommit">false</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.gleason.gt.server.model.database.PlayListEntry</value>
            <value>com.gleason.gt.server.model.database.MusicFile</value>
        </list>
    </property>
</bean>

我仍然得到同样的错误,任何想法?

UPDATE 添加服务/ DAO

@Repository("musicFileDao")
public class MusicFileDAOImpl extends GroovyTimeHibernateDAOSupport{
@Transactional()
public MusicFile getMusicFile(Integer i){
    @SuppressWarnings("unchecked")
    List<MusicFile> returnValue = (List<MusicFile>)getHibernateTemplate().find("from MusicFile where id=?",i);
    if(returnValue.size()>0){
        return returnValue.get(0);
    }
    return null;
}
}
@Service("musicFileService")
public class MusicFileService {
@Autowired
private MusicFileDAOImpl dao;

@Transactional
public MusicFile getMusicFile(Integer i){
    return dao.getMusicFile(i);
}
}

@Lob
@Column(name="file")
private byte[] file;

2 个答案:

答案 0 :(得分:2)

基本的是,一个大的对象是它自己的东西与bytea完全不同。如果要查找字节数组,请改用bytea。

大对象是一个独立的数据库实体,使用不同的接口保存,然后使用对象id引用。这需要两个SQL语句,因此在自动提交模式下不安全。对于非常大的字段,大对象是首选,原因有两个:

  1. 您可以在大型对象中存储两倍于bytea的内容,

  2. 大型对象带有流式界面,允许通过偏移等进行搜索。它们的运行方式更像文件而非数据库属性。

  3. 大对象在正确的位置非常有用,但它们有点不寻常。你有可能想要bytea。

答案 1 :(得分:0)

使用Spring Boot 2+ 有两种方法:

创建用于配置数据源的配置类,并更改Hikari行为

@Configuration
public class DataSourceConfiguration {

    // (...) some @Value(s) (...)

    @Bean
    public DataSource getDataSource() {

        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driverClassName);   
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);

        // these are optional
        config.setMinimumIdle(minumunIdle);
        config.setMaximumPoolSize(maximunPoolSize);
        config.setPoolName(poolName);
        config.setConnectionTimeout(connectionTimeout);
        config.setIdleTimeout(idleTimeout);
        config.setMaxLifetime(maxLifetime);

        // sets auto-commit to false
        config.setAutoCommit(false);

        return new HikariDataSource(config);
    }
}

或在application.properties中,可以设置以下键/值:

spring.datasource.hikari.auto-commit=false