- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想用JTA进行多线程处理。
环境:
处理:我想生成一个包含数据库中所有数据的 zip 文件。这个zip文件可能很大,所以我想在jboss将其发送到客户端的同时启动一个线程来生成流。
我的 REST 条目:
@Stateless
@Path("/exportProcess")
public class ExportProcessusResource {
@Inject
private IExport export;
@GET
@Path("/{processCode: [^/]+}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response export(@PathParam("processCode") final String pProcessCode) {
return Response.ok(export.export(pProcessCode))
.header("Content-Disposition", "attachment; filename=" + pCodeProcessus + ".zip")
.build();
}
}
我的型号:
@Entity
@Table(name = "T_PROCESS")
@NamedQueries({
@NamedQuery(name = "Process.GetByCode", query = "SELECT p FROM Process p WHERE p.code=:code")
})
public class Process {
@Column(name = "CODE", length = 50, nullable = false)
private String code;
@OneToMany(mappedBy = "process", targetEntity = Step.class)
private Collection<Step> steps;
//Getters/Setters
}
@Entity
@Table(name = "T_STEP")
public class STEP {
@Id
@Column(name = "ID_STEP")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_ID_STEP")
@SequenceGenerator(name = "SEQ_ID_STEP", sequenceName = "SEQ_ID_STEP")
private int id;
@ManyToOne(targetEntity = Process.class)
@JoinColumn(name = "CODE_PROCESS", referencedColumnName = "CODE", nullable = false)
private Process process;
//Getters/Setters
}
我的 DAO:
public interface IProcessDao {
Processus getByCode(final String pCode);
}
public class ProcessDao implements IProcessDao {
@Override
public Processus getByCode(final String pCode) {
Processus lResult = null;
try {
final TypedQuery<Processus> lRequest = pEm.createNamedQuery("Process.GetByCode", Process.class);
lRequest.setParameter("code", pCode);
lResult = lRequest.getSingleResult();
} catch (final NoResultException e) {
// Return null
lResult = null;
}
return lResult;
}
}
我的 Controller :
public interface IExport {
/**
* Generate export
*
* @param pProcessCode Process code
* @return Datas
*/
InputStream export(final String pProcessCode);
}
public class Export implements IExport {
@PersistenceContext(unitName="authorizations")
private EntityManager entityManagerAuthorizations;
@Inject
private ExportThreadHelper exportThreadHelper;
@Override
public InputStream export(final String pProcessCode) {
//Check if user has the profile. Use database "AUTHORIZATIONS"
checkProfil(entityManagerAuthorizations, Profiles.ADMIN);
final PipedInputStream lInputStream = new PipedInputStream();
OutputStream lOutputStream = null;
try {
lOutputStream = new FileOutputStream("d:/test.zip");// new
// PipedOutputStream(lInputStream);
} catch (final IOException e) {
throw new RuntimeException("Cannot start zip generation", e);
}
final ZipOutputStream lZipOutputStream = new ZipOutputStream(lOutputStream);
final Runnable lRunnable = new Runnable() {
@Override
public void run() {
try {
exportThreadHelper.export(pProcessCode, lZipOutputStream);
} catch (final Exception e) {
logger.error(e);
} finally {
IOUtils.closeQuietly(lZipOutputStream);
}
}
};
//To execute in same thread :
//lRunnable.run();
//To execute in another thread
final Thread lThread = new Thread(lRunnable);
lThread.start();
try {
lThread.join();
} catch (final InterruptedException e1) {
throw new RuntimeException(e1);
}
try {
return new FileInputStream("d:/test.zip");
} catch (final FileNotFoundException e) {
logger.error(e);
}
return lInputStream;
}
}
public class ExportThreadHelper {
private class ProcessToExport {
//...
}
@PersistenceContext
@Named("Application")
private EntityManager entityManagerThreadable;
@Inject
private IProcessDao processDao;
public void export(final String pProcesssCode, final ZipOutputStream pZipOutputStream)
throws MyWayBusinessException {
try {
final ProcessToExport lProcessToExport = new ProcessToExport();
transaction(entityManagerThreadable, new Callable<Void>() {
@Override
public Void execute() {
final Process lProcess = processDao.getByCode(pProcesssCode);
for (final Step lStep : lProcess.getSteps()) {
//Many things
}
return null;
}
});
//MANY OTHER TREATMENTS
} catch (final Exception e) {
logger.error(e);
throw new RuntimeException("Cannot generate export", e);
}
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
protected <T> T transaction(final EntityManager pEntityManager, final Callable<T> pCallable) {
//I've tried with and without the annotation and with and without the "UserTransaction"
try {
final UserTransaction tx = com.arjuna.ats.jta.UserTransaction.userTransaction();
try {
tx.begin();
final T lResultat = pCallable.execute();
tx.commit();
return lResultat;
} catch (final Throwable e) {
tx.rollback();
throw e;
}
} catch (final Throwable e) {
throw new RuntimeException(e);
}
}
}
我的 persistence.xml :
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd ">
<persistence-unit name="APPLICATION" transaction-type="JTA">
<jta-data-source>java:/jdbc/app</jta-data-source>
<class>Processus</class>
<class>Step</class>
<properties>
<!-- Scan for annotated classes and Hibernate mapping XML files -->
<property name="hibernate.archive.autodetection" value="class, hbm" />
</properties>
</persistence-unit>
<persistence-unit name="AUTHORIZATION" transaction-type="JTA">
<jta-data-source>java:/jdbc/AUTHORIZATION</jta-data-source>
<!-- many things... -->
</persistence-unit>
</persistence>
(我已经清理了代码以仅保留重要的内容)。
而且,如果我使用单线程版本 (lRunnable.run()),我有 zip 文件,但如果我运行多线程版本 (thread.start())(我已在此处阻止以确保我的测试连接不会被父线程关闭,但在我删除 thread.join() 后)我会出现此异常:
ERROR [...ExportThreadHelper] (Thread-115) failed to lazily initialize a collection of role: .steps, could not initialize proxy - no Session: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: .steps, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:569) [hibernate-core-4.2.14.SP1-redhat-1.jar:4.2.14.SP1-redhat-1] at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:188) [hibernate-core-4.2.14.SP1-redhat-1.jar:4.2.14.SP1-redhat-1] at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:548) [hibernate-core-4.2.14.SP1-redhat-1.jar:4.2.14.SP1-redhat-1] at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:126) [hibernate-core-4.2.14.SP1-redhat-1.jar:4.2.14.SP1-redhat-1] at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266) [hibernate-core-4.2.14.SP1-redhat-1.jar:4.2.14.SP1-redhat-1] at ExportThreadHelper$1.execute(ExportThreadHelper.java:101) [metier-2.3.0-SNAPSHOT.jar:] at ExportThreadHelper$1.execute(ExportThreadHelper.java:1) [metier-2.3.0-SNAPSHOT.jar:] at ExportThreadHelper.transaction(ExportThreadHelper.java:148) [metier-2.3.0-SNAPSHOT.jar:] at ExportThreadHelper.export(ExportThreadHelper.java:97) [metier-2.3.0-SNAPSHOT.jar:] at ExportMetier$1.run(ExportMetier.java:62) [metier-2.3.0-SNAPSHOT.jar:] at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_04]
您发现我的代码有问题吗?
最佳答案
您需要像这样更改查询:
@NamedQueries({
@NamedQuery(name = "Process.GetByCode", query = "SELECT p FROM Process p LEFT JOIN FETCH p.steps WHERE p.code=:code")
})
关于java - JTA事务和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34356850/
JTA 和本地事务有什么区别? 如果有一个示例可以展示何时使用 JTA 以及何时使用本地事务,那就太好了。 最佳答案 JTA 是用于管理 Java 事务的通用 API。它允许您以资源中立的方式启动、提
我正在使用 Atomikos 进行 JTA 事务。 我对 JTA 有以下设置: UserTransactionImp userTransactionImp = new UserTransactionI
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我想找到一种方法来应用带有 JTA @Transactional 注释的自定义拦截器。 我有一个带有 @Transactional 的方法,它是业务事务之一。在该方法中我想: 进行一些数据库操作 使用
我正在更新旧的应用程序,并尽可能少地重新编程。我创建了一个与旧页面类似的页面,其中仅包含一些测试数据,以确保我可以创建与 ejb/jpa 的链接,但我遇到了问题。我将发布 jsp、persistenc
本文整理了Java中com.arjuna.ats.internal.jta.tools.osb.mbean.jta.XAResourceRecordBean类的一些代码示例,展示了XAResource
我们将 JPA 1.0 用于基于 ORM 的操作,并且我们希望我们的应用程序拥有 JTA 数据源。我们只有 1 个数据库,我们的应用程序将连接到该数据库。 我们在 Controller 类中开始我们的
本文整理了Java中com.arjuna.ats.internal.jta.tools.osb.mbean.jta.XAResourceRecordBean.()方法的一些代码示例,展示了XAReso
本文整理了Java中com.arjuna.ats.internal.jta.tools.osb.mbean.jta.XAResourceRecordBean.getUid()方法的一些代码示例,展示了
我如何定义 在 persistence.xml 中? 我的项目在 Tomcat 6 和 Tomcat 7 中运行良好。 现在我正在使用 Struts 2 Spring 3.0.5 JPA 2 Jbos
我想为我正在处理的应用程序编写集成测试。它使用 JTA(多资源)并在应用程序服务器内运行。为这种情况编写自动化测试的最佳方法是什么?使用像 atomikos 这样的独立事务管理器,或者以某种方式利用应
我们正在使用 jboss 管理的 EntityMangerFactory 使用以下 spring bean 现在在我们的 spring bean 中,我们使用 @PersistenceContext
从 JTA 规范中,我了解到它仅用于调用线程的分布式事务(或支持)。这是否意味着事务不能跨越多个线程?还是取决于实现? 是否有任何 JTA 实现支持跨线程 XA? 谢谢! 最佳答案 您可以使用 Tra
本地交易和BMT相同吗? 我们需要 transactionManager 来进行本地事务吗? 我读到 transactionManager 对于本地事务将无效。这是正确的吗? JTA 是否为 CMT
我是 Spring 和 hibernate 新手,请帮忙, 我正在使用(Jboss 6.0 Final 作为服务器) org.springframework.transaction.jta.JtaTr
假设我有一个托管 bean 并且定义了一个 EntityManager。我想知道交易是如何运作的以及它们在各种不同情况下的表现如何。从文档中我了解到,flush()实际上用于覆盖提交上的延迟并立即执行
试图将我的头脑围绕在 JTA 上并任意选择 Bitronix 作为 impl,因为文档更容易获得(与 Atmikos 相反,Atmikos 让你注册并注册以获得 src/docs/jars/等等)。
我使用以下我在网上找到的代码 ( Here ) 作为 JTA 事务处理的示例: // Get a UserTransaction UserTransaction txn = new I
我有 2 个 MySQL 架构和各自的 MysqlXADataSource 配置如下 - @Bean(name = "sourceDataSource") @Primary public DataSo
我正在开发一个Web应用程序,我必须使用我从未使用过的JTA。我开始使用 EntityManager 但它似乎在这里不起作用。当我使用 EntityManager 时,我收到此消息: Only per
我是一名优秀的程序员,十分优秀!