Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Java 正在通过EntityManager实例设置jdbc url属性,请重新打开连接_Java_Jpa_Jdbc_Eclipselink - Fatal编程技术网

Java 正在通过EntityManager实例设置jdbc url属性,请重新打开连接

Java 正在通过EntityManager实例设置jdbc url属性,请重新打开连接,java,jpa,jdbc,eclipselink,Java,Jpa,Jdbc,Eclipselink,这是我的EntityManager工厂: Map<String, Object> properties = new HashMap<>(); properties.put("provider", org.eclipse.persistence.jpa.PersistenceProvider.class); properties.put("eclipselink.cache.shared.default", "false"); properties.put("javax.p

这是我的EntityManager工厂:

Map<String, Object> properties = new HashMap<>();
properties.put("provider", org.eclipse.persistence.jpa.PersistenceProvider.class);
properties.put("eclipselink.cache.shared.default", "false");
properties.put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/na");
properties.put("javax.persistence.jdbc.user", "UserName");
properties.put("javax.persistence.jdbc.password", "Password");
EntityManagerFactory emfForJPAContainer = Persistence.createEntityManagerFactory("persistenceUnit"R, properties);
EntityManager em = emfForJPAContainer.createEntityManager();
em.setProperty("eclipselink.tenant-id","na");
现在,下面将使用上面的同一EntityManager将用户帐户保存到模式“na_1”:

em.setProperty("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/na_1");
em.getTransection().begin();
UserAccount ua = new UserAccount(userName, pass);
em.persist(ua);
em.getTransection().commit();
现在,当我在运行时设置jdbc url时,如下所示:

 em.setProperty("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/na_1");
它是否使用na_1模式重新连接数据库? 效率高吗?还是会对绩效产生不良影响

顺便说一句,我使用的是EclipseLink 2.6.1

已编辑:这是我的persistence.xml文件:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>Here goes all class path</class>
</persistence-unit>

org.eclipse.persistence.jpa.PersistenceProvider
下面是所有类路径

首先,您要用相同的值再次设置相同的属性,这样就不会有任何区别。 除此之外,如果设置属性运行时并执行“em.getTransition().begin();”,则它将使用新属性,但如果在设置属性运行时后执行代码: em.setProperty(“javax.persistence.jdbc.url”,“jdbc:mysql://localhost:3306/na_1"); em.getTransition().begin()


它将覆盖运行时属性。

EMF控制数据存储连接。EM只使用EMF提供的东西。是的,我知道EMF控制数据存储连接。然后,当EMF第一次初始化时,模式是“na”,然后当我设置em.setProperty(“javax.persistence.jdbc.url”,“jdbc:mysql://localhost:3306/na_1)然后EntityManager正在处理模式na_1,尽管EMF没有任何更改。那么实际上发生了什么呢?调用该方法绝对不能保证JPA提供者将支持任何此类属性。i、 e您的代码变得特定于供应商。许多供应商不允许您在单个EM中更改数据库。关于EclipseLink正在做什么,请查看代码。。。仅为该EM获取一个新数据源并使用该EM的连接?JPA规范中没有定义发生了什么更好地指定您试图完成什么,因为这实际上并不重要-更改数据库或连接的任何部分会使缓存中存储的数据不一致。如果您试图为特定客户机使用特定连接,则需要关闭共享缓存,以便数据不会在这些客户机之间意外共享-请参阅当它覆盖运行时属性时,它是否会重新连接jdbc url中新架构的数据库?它实际上不会重新连接。它将只连接一次,这取决于begin事务是在此运行时属性集之前还是之后执行。
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>Here goes all class path</class>
</persistence-unit>