Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Spring,没有绑定到线程的Hibernate会话_Multithreading_Spring_Hibernate - Fatal编程技术网

Multithreading Spring,没有绑定到线程的Hibernate会话

Multithreading Spring,没有绑定到线程的Hibernate会话,multithreading,spring,hibernate,Multithreading,Spring,Hibernate,我得到了这个错误,我不知道为什么 我已经定义了我的transactionManager: <bean id="transactionManager" class="com.transaction.data.HibernateTransactionManager"> --> my own class <property name="sessionFactory" ref="sessionFactory" /> </bean> <be

我得到了这个错误,我不知道为什么

我已经定义了我的transactionManager:

<bean id="transactionManager"
    class="com.transaction.data.HibernateTransactionManager"> --> my own class
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="txTemplate" abstract="true"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="get*">
                PROPAGATION_SUPPORTS,ISOLATION_READ_UNCOMMITTED,readOnly
            </prop>
            <prop key="list*">
                PROPAGATION_SUPPORTS,ISOLATION_READ_UNCOMMITTED,readOnly
            </prop>             
            <prop key="*">
                PROPAGATION_REQUIRED,ISOLATION_SERIALIZABLE
            </prop>
        </props>
    </property>
</bean>
我的思路是:

public final class ExecuteEEThread extends Thread {    
    @Override
    public void run() {
        boolean executing = true;
       ....
        try {
            if (executing) {
                states.put("EE", EXECUTING);                    
                engine.process();
                states.put("EE", END);

                if (log.isDebugEnabled()) {
                    log.debug("Engine ended.");
                }
            }
        } catch (Exception ex) {
            ....
        }
....
    }    
最后,我在我的管理器中执行的代码类型以及我得到异常的地方是一个简单的DAO,如下所示

 private void configurationSet() {
        List<TableUser> rtList =
                manager.getTableUserDAO().list(0, Integer.MAX_VALUE); --> excepcion

       ......
    }
@Override
    @PostFilter("filterObject.owner==null or hasRole(filterObject.owner)")
    public List<TableUser> list(final int init, final int maxValue) {
        final Session session = sessionFactory.getCurrentSession(); --> exception
        return crit.list();
    }

首先删除TransactionProxyFactoryBean,因为它使用起来很麻烦,并且会在某一点上导致错误(注入错误的依赖项非代理实例等)。您正在将Spring3.1(或hihger)与Hibernate4一起使用

我建议在
com.myapp.manager.ManagerImpl
类上使用
@Transactional

@Transactional
public class ManagerImpl extends Manager {}
然后在您的配置中添加
,而不是
TransactionProxyFactoryBean
(如果您有更多,您可以删除它们)。我将从类级别的
@Transactional
开始,看看是否可以让它工作,如果可以,根据当前配置修改不同的方法

您的管理器是事务性的,但您要做的第一件事是通过直接调用dao绕过所有事务(您甚至可以在管理器上使用一个丑陋的getter)

上述代码绕过所有事务配置。您的管理器上应该有一个列出用户的方法(或者将
表userdao
也设置为事务性的(现在应该只是将
@transactional
添加到其中)


您在JEE容器中启动线程,这基本上是不应该做的。我强烈建议为此使用springs
TaskExecutor
抽象。您可以创建一个
prototype
作用域bean来表示您要执行的任务,并将其传递给执行者。这将为您提供一个可重用的
ThreadPool
和容器线程管理的良好集成,除此之外,它还允许spring将依赖项注入到任务中(而不是自己这样做)。并将您从使用
线程中解放出来。

发布创建线程并获取会话的代码。还有,为什么要使用旧的和不推荐的
TransactionProxyFactoryBean
您应该尽可能避免使用它(因为这会给您带来很多麻烦)。还有,为什么您有自己的
HibernateTransactionManager实现
它有什么自定义功能?还有
scope=“singleton”
是默认设置,与事务无关。您的意思是:scope=“singleton”是默认值,这与事务无关??是的,正如它所说。Spring Bean默认为单例。事实上,某些东西是单例还是非单例与事务是否工作无关。请添加您获得的stacktrace。谢谢,我有一个关于管理器的小问题。我想如果我的经理是事务型的,但我对我的“TableUserDao”只字不提,这也将是事务性的..我真的不明白为什么我会将我的Dao标记为事务性的.对管理器来说这还不够吗?想象一下,我将通过我的Dao插入一条记录,然后发生一个异常,我会抛出该异常,它会工作,因为管理器是事务性的,对吗?哦,一切都应该是ea请使用注释,但我们希望所有代码保持相同的样式,并且不使用太多注释。这就是为什么我没有将类标记为@Transactional。非常感谢您对Threads!的建议,我将阅读有关TaskExecutor的内容。然后至少使用
来标记您的事务。您可以我真的不想再使用
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
。它在Spring 1.x时间段中被使用和需要,应该被认为是不推荐的。管理器上的方法确实是事务性的,但是只要
getTableUserDAO
完成了事务处理行动已经结束。只有当你的经理有一个列表方法时,它才会起作用。你不应该使用经理/服务或任何东西,然后拉出它的依赖项…是的,我更喜欢,我有另一个项目在使用它。我必须阅读关于TransactionProxyFactoryBean的建议和缺点。我不知道,我会寻找关于它的信息。我不明白的是,当我试图从另一个类获取currentSession时,如果一个管理器在事务中,为什么会出现初始错误。有没有简单的解释?我做了转换的“引擎”子项,它可以工作,尽管我不喜欢它。那么,我必须在调用“开始”之前创建转换吗?如果DAO是事务性的,它是否也可以工作?
public final class ExecuteEEThread extends Thread {    
    @Override
    public void run() {
        boolean executing = true;
       ....
        try {
            if (executing) {
                states.put("EE", EXECUTING);                    
                engine.process();
                states.put("EE", END);

                if (log.isDebugEnabled()) {
                    log.debug("Engine ended.");
                }
            }
        } catch (Exception ex) {
            ....
        }
....
    }    
 private void configurationSet() {
        List<TableUser> rtList =
                manager.getTableUserDAO().list(0, Integer.MAX_VALUE); --> excepcion

       ......
    }
@Override
    @PostFilter("filterObject.owner==null or hasRole(filterObject.owner)")
    public List<TableUser> list(final int init, final int maxValue) {
        final Session session = sessionFactory.getCurrentSession(); --> exception
        return crit.list();
    }
 * @author Juergen Hoeller
 * @since 3.1
 * @see #setSessionFactory
 * @see #setDataSource
 * @see org.hibernate.SessionFactory#getCurrentSession()
 * @see org.springframework.jdbc.datasource.DataSourceUtils#getConnection
 * @see org.springframework.jdbc.datasource.DataSourceUtils#releaseConnection
 * @see org.springframework.jdbc.core.JdbcTemplate
 * @see org.springframework.jdbc.datasource.DataSourceTransactionManager
 * @see org.springframework.transaction.jta.JtaTransactionManager
 */
@SuppressWarnings("serial")
public class HibernateTransactionManager 
@Transactional
public class ManagerImpl extends Manager {}
manager.getTableUserDAO().list(0, Integer.MAX_VALUE);