【问题标题】:How to configure DB connection in a Servlet based JPA application如何在基于 Servlet 的 JPA 应用程序中配置数据库连接
【发布时间】:2011-02-28 04:28:14
【问题描述】:
默认情况下,JPA 应用程序的数据库连接在 META-INF/persistence.xml 中配置,当应用程序未部署到完整的 Java EE 应用程序服务器时。在我看来,将这种特定于环境的配置放入 .war 文件中的文件不是很优雅。如何更灵活地配置基于 Servlet 的 JPA 应用程序的数据库连接(=在 .war 文件之外)?
【问题讨论】:
标签:
java
database
deployment
jpa
jakarta-ee
【解决方案1】:
在persistence.xml 中放置一个JNDI 查找名称,而不是原始连接参数。这会将实际的连接信息外部化,以便您可以在它所属的应用服务器中设置它。
另一种方法可能是将连接参数放入数据库中。
【解决方案3】:
在 Servlet 容器中,还可以使用 数据源 和非 JTA (RESOURCE_LOCAL) persistence.xml。在 non-jta-data-source 元素中声明您的数据源:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>java:comp/env/ds/OracleDS</non-jta-data-source>
<properties/>
</persistence-unit>
【解决方案4】:
您没有将环境特定的东西放在persistence.xml 中。
有两个间接级别
1) 在您的 persistence.xml 中,您将拥有类似 ...
<persistence 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"
version="2.0">
<persistence-unit name="sample">
<jta-data-source>java:comp/env/jdbc/DefaultDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="..."/>
<property name="hibernate.hbm2ddl.auto" value="..."/>
</properties>
</persistence-unit>
</persistence>
假设您使用的是 Tomcat,那么您将在 Tomcat 中定义数据源,这就是您实际进行数据源配置的地方。
2) 在您的 CONTEXT.XML 中输入以下代码...
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/DefaultDS" auth="Container"
type="javax.sql.DataSource" username="wally" password="wally"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost;DatabaseName=mytest;SelectMethod=cursor;"
maxActive="8"
/>
</Context>