我在 Tomcat 7.0 上开发了一个应用程序,它使用 Datanucleus/JDO 来访问数据库。我目前将 JDO 连接属性存储在应用程序本身的“datanucleus.properties”中。连接工作正常,但我想将连接信息存储为 JNDI,将其保存在服务器上,而不是在 war 本身中(远程部署时我总是必须替换 war 中的文件)。
我尝试了以下方法:
在应用程序的 web.xml 中创建一个 (jdbc/ConnectionDB)
在“Server.xml”中,我尝试在我的应用程序上下文中添加以下内容
<Resource name="jdbc/ConnectionDB" auth="Container" type="javax.jdo.PersistenceManagerFactory" /> <ResourceParams name="jdbc/ConnectionDB <parameter> <name>javax.jdo.PersistenceManagerFactoryClass</name> <value>org.datanucleus.api.jdo.JDOPersistenceManagerFactory</value> </parameter> <parameter> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </parameter> <parameter> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/TomcatTest</value> </parameter> ...
然后我尝试使用以下语法创建一个新的 PMF:
上下文上下文=空; PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("java:comp/env/jdbc/ConnectionDB",context);
当我运行我的应用程序时,我得到一个 javax.jdo.JDOUserException:您已经为此 PMF 指定使用“datanucleus.properties”的“持久性单元”(但这不存在!)
我真的不明白我的设置有什么问题。
问候,
马塞尔
最佳答案
我终于找到了我正在寻找的解决方案,我把它贴在这里,它可能对其他人有帮助:
在服务器的“Context.xml”文件中创建一个资源
<Resource name="jdbc/SyncTestDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="mysql" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/SyncTestDB"/>
在应用程序的“web.xml”文件中创建对该资源的引用
<resource-ref> <description>MySQL Database Connection</description> <res-ref-name>jdbc/SyncTestDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
最后使用 JNDI 连接获得 Persistence Manager Factory:
PersistenceManagerFactory pmf; Properties properties = new Properties(); properties.setProperty("datanucleus.ConnectionFactoryName","java:comp/env/jdbc/SyncTestDB");
关于java - Datanucleus (JDO) 的 Tomcat JNDI 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9991550/