我在Tomcat托管的Servlet中将JPA与Hibernate一起使用。
我使用的数据库是MySQL。
我不使用JNDI或连接池。
这是我的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="pixxio-jpa" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>de.java2enterprise.onlineshop.model.AccessToken</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.88.88:3306/felix1_0"/>
<property name="javax.persistence.jdbc.user" value="felix1_0"/>
<property name="javax.persistence.jdbc.password" value="mypassword"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
</persistence-unit>
</persistence>
这是我的Servlet中的重要代码:
void doubleDatabaseConnection(PrintWriter out) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pixxio-jpa", null);
EntityManager em = emf.createEntityManager();
EntityManager em2 = emf.createEntityManager();
getDatabaseSessionId(out, em);
getDatabaseSessionId(out, em2);
em.close();
em2.close();
emf.close();
}
void getDatabaseSessionId(PrintWriter out, EntityManager entityManager) {
Query q = entityManager.createNativeQuery("SELECT CONNECTION_ID();");
BigInteger result = (BigInteger) q.getSingleResult();
out.println("<br>Database Session Id: " + result);
}
这是由servlet打印的:
Database Session Id: 51317
Database Session Id: 51317
我假设在创建EntityManager时已建立实际的数据库连接。因此,我假设来自两个EntityManager实例的两个MySQL-Connection-ID不同。
是否可以从一个EntityManagerFactory实例创建多个不同的数据库连接?
我想指出,更改JPA提供程序是我的选择。
答案 0 :(得分:1)
如果不需要事务,休眠将使用相同的连接。
如果您开始进行翻译,则会获得新的连接
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“ pixxio-jpa”,空);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
EntityManager em2 = emf.createEntityManager();
em2.getTransaction().begin();
getDatabaseSessionId(System.out, em);
getDatabaseSessionId(System.out, em2);
em.close();
em2.close();
emf.close();
已更新
仅供参考:如果您未设置连接池(最小= 1;最大= 20),则Hibernate将使用它自己的连接池。