Datatucleus(JDO)的Tomcat JNDI资源

时间:2012-04-03 10:37:35

标签: java tomcat jndi datanucleus

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

我尝试了以下内容:

  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:

    Context context = null; PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(“java:comp / env / jdbc / ConnectionDB”,context);

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

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

    此致

    马塞尔

2 个答案:

答案 0 :(得分: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");
    

答案 1 :(得分:0)

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

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

您可以为“javax.jdo.option.ConnectionFactoryName”属性指定带有该JNDI字符串的persistence.xml。根据JDO规范和DataNucleus / Tomcat文档然后