在这篇文章中,我们将带领您了解JavaCDI@PersistenceContext和线程安全的全貌,包括javasimpledateformat线程安全的相关情况。同时,我们还将为您介绍有关Excep
在这篇文章中,我们将带领您了解Java CDI @PersistenceContext和线程安全的全貌,包括java simpledateformat线程安全的相关情况。同时,我们还将为您介绍有关Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...、glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager、iphone – NSPersistentStoreCoordinator线程安全吗?、java – JBoss AS 7无法使用@PersistenceContext注入RESOURCE_LOCAL容器管理的EntityManagers的知识,以帮助您更好地理解这个主题。
本文目录一览:- Java CDI @PersistenceContext和线程安全(java simpledateformat线程安全)
- Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...
- glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager
- iphone – NSPersistentStoreCoordinator线程安全吗?
- java – JBoss AS 7无法使用@PersistenceContext注入RESOURCE_LOCAL容器管理的EntityManagers
Java CDI @PersistenceContext和线程安全(java simpledateformat线程安全)
在多个类中,EntityManager @Inject [ed]
是否是线程安全的?
@PersistenceContext(unitName="blah")private EntityManager em;
答案1
小编典典尽管EntityManager实现本身不是线程安全的,但是Java EE容器注入了一个代理,该代理将所有方法调用委托给与事务绑定的EntityManager。因此,每个事务都使用其自己的EntityManager实例。至少对于事务范围的持久性上下文而言,这是正确的(默认设置)。
如果容器将在每个bean中注入EntityManager的新实例,则以下操作将无效:
@Statelesspublic class Repository1 { @EJB private Repository2 rep2; @PersistenceContext(unitName="blah", type = PersistenceContextType.TRANSACTION) private EntityManager em; @TransactionAttribute public void doSomething() { // Do something with em rep2.doSomethingAgainInTheSameTransaction(); }}@Statelesspublic class Repository2 { @PersistenceContext(unitName="blah", type = PersistenceContextType.TRANSACTION) private EntityManager em; @TransactionAttribute public void doSomethingAgainInTheSameTransaction() { // Do something with em }}
doSomething-> doSomethingAgainInTheSameTransaction调用在单个事务中发生,因此bean必须共享相同的EntityManager。实际上,它们共享同一个代理EntityManager,该代理将调用委派给同一持久性上下文。
因此,您可以在单例bean 中合法使用EntityManager,如下所示:
@Singleton@ConcurrencyManagement(ConcurrencyManagementType.BEAN)public class Repository { @PersistenceContext(unitName="blah", type = PersistenceContextType.TRANSACTION) private EntityManager em;}
另一个证明是,在EntityManager javadoc中没有提及线程安全。因此,当您停留在Java EE容器中时,无需关心对EntityManager的并发访问。
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...
swing
Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persistence provider for EntityManager named null
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at com.hs.selenium.MainFrame.initComponents(MainFrame.java:49)
at com.hs.selenium.MainFrame.<init>(MainFrame.java:30)
at com.hs.selenium.MainFrame$2.run(MainFrame.java:198)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager
配置如下
<?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="core" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>core_test</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="none"/> </properties> </persistence-unit> </persistence>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"> <resources> <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="oracle.jdbc.pool.OracleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="oracle-thin_corePool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> <property name="serverName" value="10.1.20.25"/> <property name="portNumber" value="1521"/> <property name="databaseName" value="pp"/> <property name="User" value="core"/> <property name="Password" value="core"/> <property name="URL" value="jdbc:oracle:thin:@10.1.20.25:1521:pp"/> <property name="driverClass" value="oracle.jdbc.OracleDriver"/> </jdbc-connection-pool> <jdbc-resource enabled="true" jndi-name="core_test" object-type="user" pool-name="oracle-thin_corePool"/> </resources>程序如下 返 回的
EntityManager为空
@Stateless public class UserJpaController implements Serializable { @Resource private UserTransaction utx; // @PersistenceContext(unitName="core") // private EntityManagerFactory emf; @PersistenceContext(unitName="core") private EntityManager iem; public EntityManager getEntityManager() { // return emf.createEntityManager(); System.out.println("iem is " + iem); return iem; }
iphone – NSPersistentStoreCoordinator线程安全吗?
明显的方法是为后台线程专门创建一个托管对象上下文,但是在Apple’s Core Data Programming Guide中我读了这一行:
A persistent store coordinator provides to its managed object contexts the façade of one virtual store. For completely concurrent operations you need a different coordinator for each thread.
所以这里的catch:你不能有两个NSPersistentStoreCoordinators提供对同一个商店的访问.但是,marcus Zarra的核心数据书认为NSPersistentStoreCoordinator是线程安全的,并且将序列化I / O请求(第157页).
有人可以为我清除这个吗?在另一个线程上运行第二个托管对象上下文是否可能与主线程共享相同的NSPersistentStoreCoordinator?还是更简洁的是NSPersistentStoreCoordinator线程安全?
解决方法
Although the NSPersistentStoreCoordinator is not thread safe either,the NSManagedobjectContext kNows how to lock it properly when in use. Therefore,we can attach as many NSManagedobjectContext objects to a single NSPersistentStoreCoordinator as we want without fear of collision.
java – JBoss AS 7无法使用@PersistenceContext注入RESOURCE_LOCAL容器管理的EntityManagers
@PersistenceContext(unitName="TestPU") private EntityManager entityManager;
当我尝试使用RESOURCE_LOCAL PersistenceUnit时,我收到错误,说我无法使用@PersistenceContext注入RESOURCE_LOCAL PU.
我已经配置了persistence.xml,如下所示:
<persistence-unit name="TestPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="javax.persistence.jdbc.driver" value="com.MysqL.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:MysqL://localhost:3306/xy"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="blah"/> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit>
而在我的DAO中,
@Stateless public class UserDAO { @PersistenceContext(unitName="TestPU") private EntityManager entityManager; }
当我在AS 7.1.1上部署我的应用程序时,我收到以下错误.
JBAS011428: Cannot inject RESOURCE_LOCAL container managed EntityManagers using @PersistenceContext at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor$1.handle(ModuleJndiBindingProcessor.java:169) at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54) at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.processClassConfigurations(ModuleJndiBindingProcessor.java:162) at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:155) at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final] ... 5 more
任何解决方案使用RESOURCE_LOCAL PU与@PersistenceContext?
解决方法
RESOURCE_LOCAL:在Java SE中,应用程序必须明确管理事务&资源本地事务是本地事务.你必须创建EntityManagerFactory&那么可以从它创建实体管理器.
当您在应用程序服务器中部署它时,请将事务类型更改为persistence.xml中的JTA.
关于Java CDI @PersistenceContext和线程安全和java simpledateformat线程安全的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persi...、glassfish +jersey 用 @PersistenceContext 无法获得注入的 EntityManager、iphone – NSPersistentStoreCoordinator线程安全吗?、java – JBoss AS 7无法使用@PersistenceContext注入RESOURCE_LOCAL容器管理的EntityManagers的相关信息,请在本站寻找。
本文标签: