【问题标题】:Tomcat JNDI resource for Datanucleus (JDO)Datanucleus (JDO) 的 Tomcat JNDI 资源
【发布时间】:2012-04-03 10:37:34
【问题描述】:

我在 Tomcat 7.0 上开发了一个使用 Datanucleus / JDO 访问数据库的应用程序。我目前将 JDO 连接属性存储在应用程序本身的“datanucleus.properties”中。连接工作正常,但我想将连接信息存储为 JNDI,将其存储在服务器上,而不是在 war 本身中(远程部署时我总是需要替换 war 中的文件)。

我尝试了以下方法:

  1. 在应用程序的web.xml中创建一个(jdbc/ConnectionDB)

  2. 在“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> 
    ...
    
  3. 然后我尝试使用以下语法创建一个新的 PMF:

    上下文上下文 = null; PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("java:comp/env/jdbc/ConnectionDB",context);

当我运行我的应用程序时,我得到一个 javax.jdo.JDOUserException: 你要么指定此 PMF 使用“datanucleus.properties”的“持久性单元”(但这不存在!)

我真的不明白我的设置出了什么问题。

问候,

马塞尔

【问题讨论】:

  • Marcel,我正在做完全相同的事情,试图让 datanucleus、tomcat 和 mysql 一起工作。我的问题是由于某种原因我无法让 eclipse 插件在我的类上工作,并且我不断收到类不可持久异常。相同的代码适用于独立应用程序。我几乎可以肯定我在放置 orm 文件的位置等方面存在问题,如果您可以通过共享文件夹结构和 xml 文件和部署来提供帮助,如果这将是一个巨大的帮助。我在这里发布了一个问题,但还没有答案。抬头看看我的问题。提前致谢。

标签: java tomcat jndi datanucleus


【解决方案1】:

我终于找到了我正在寻找的解决方案,我把它贴在这里,它可能会帮助其他人:

  1. 在服务器的“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"/>
    
  2. 在应用程序的“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>
    
  3. 最后使用 JNDI 连接获得 Persistence Manager Factory:

    PersistenceManagerFactory pmf;
    Properties properties = new Properties();
    properties.setProperty("datanucleus.ConnectionFactoryName","java:comp/env/jdbc/SyncTestDB");
    

【讨论】:

    【解决方案2】:

    阅读 JDOHelper.getPersistenceManagerFactory(String) 的 javadoc,它显然不是为了传入一些 JNDI 数据源字符串。

    阅读 Tomcat 的文档,您还会看到指定数据源时不会提供 JDO 连接详细信息。

    您同样可以使用该 JNDI 字符串为“javax.jdo.option.ConnectionFactoryName”属性指定一个 persistence.xml。然后按照 JDO 规范和 DataNucleus/Tomcat 文档

    【讨论】:

    • 您好 DataNucleus,我想做您在第三点中提到的内容。但是 Datanucleus 在线文档并不完全有帮助,我只发现了以下“另一种选择是调用 JDOHelper.getPersistenceManagerFactory(jndiLocation, context); ,因此通过 JNDI 访问属性。”我试图将 JDO 属性作为 JDNI 存储在 Server.xml 中,但这不起作用...
    • 只需将持久性属性(在属性文件中,或通过映射)指定给 JDOHelper.getPersistenceManagerFactory。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2014-12-24
    • 1970-01-01
    • 2012-02-07
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多