2010-05-26 10 views
11

server.xml में मैं वैश्विक संसाधन परिभाषित किया है (मैं उपयोग कर रहा हूँ बिलाव 6):चर्चा करते हुए persistence.xml में बिलाव JNDI डेटा स्रोत

<GlobalNamingResources> 
    <Resource name="jdbc/myds" auth="Container" 
      type="javax.sql.DataSource" 
      maxActive="10" maxIdle="3" maxWait="10000" 
      username="sa" password="" 
      driverClassName="org.h2.Driver" 
      url="jdbc:h2:~/.myds/data/db" 
    /> 
</GlobalNamingResources> 

मैं catalina.out कि इस बाध्य है में देखते हैं, तो मुझे लगता है कि यह ठीक है।

अपने वेब ऐप्लिकेशन में मैं डेटा स्रोत के लिए लिंक है, मुझे यकीन है कि यह ठीक है नहीं कर रहा हूँ:

<Context>  
<ResourceLink global='jdbc/myds' name='jdbc/myds' type="javax.sql.Datasource"/>  
</Context> 

और आवेदन में वहाँ 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="oam" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>jdbc/myds</non-jta-data-source> 
    <!-- class definitions here, nothing else --> 

    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

यह होना चाहिए ठीक है, लेकिन शायद यह या संसाधन स्रोत परिभाषा गलत है क्योंकि मुझे मिल रहा है:

javax.naming.NameNotFoundException: नाम jdbc इस संदर्भ में

क्या गलत है और यह क्यों काम नहीं करता है?

अद्यतन:

मैं सीधे डेटा स्रोत प्राप्त करने के लिए कोशिश की है:

public class WebAppListener implements ServletContextListener 
{ 
    // ServletContextListener interface - start 
    public void contextInitialized(ServletContextEvent sce) 
    { 
     try 
     { 
      Context initCtx = new InitialContext(); 
      Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
      DataSource ds = (DataSource) 
      envCtx.lookup("jdbc/myds"); 
     } 
     catch (NamingException ex) 
     { 
      System.out.println("!!!! Got NamingException:"); 
      ex.printStackTrace(System.out); 
     } 
    } 

    public void contextDestroyed(ServletContextEvent sce) { } 

} 

मेरे web.xml:

<listener> 
    <display-name>Listener</display-name> 
    <listener-class>WebAppListener</listener-class> 
    </listener> 

अब भी वही त्रुटि हो रही है, हालांकि मैं देख रहा हूँ जब मैं टॉमकैट (कैटालिना - डेटासोर्स - javax.sql.Datasource = "jdbc/myds":से कनेक्ट करता हूं तो जेएमएक्स कंसोल में डेटासोर्सऑब्जेक्टनाम = कैटालिना: टाइप = डेटासोर्स, क्लास = javax.sql.DataSource, name = "jdbc/myds"।)

+0

क्या आपने अपनी समस्या का समाधान किया है? यदि हां, तो कैसे? – artaxerxe

+0

दुर्भाग्य से नहीं, कुछ अवधारणा शिफ्ट की वजह से कोई और मांग नहीं थी। –

उत्तर

9

<non-jta-data-source>persistence.xml में http://forums.oracle.com/forums/thread.jspa?messageID=1899677

में

java:comp/env/jdbc/myds

प्रतिक्रिया के अनुसार

होना चाहिए और यह भी $CATALINA_HOME/lib

+0

कोशिश की, पुनः जांच, काम नहीं करता है। –

+1

हम्म, क्या आप इस ट्यूटोरियल के माध्यम से भाग सकते हैं और देख सकते हैं कि सभी चरण मेल खाते हैं या नहीं। http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial – JoseK

+0

मैं ट्यूटोरियल को देखूंगा हालांकि मैं ग्रहण का उपयोग नहीं करता हूं। –

0

में अपने डाटाबेस ड्राइवर आप के लिए है कि संसाधन उपलब्ध बनाने था है इसे अपने web.xml में घोषित करके एप्लिकेशन?

<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/myds</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 
+0

यह वैश्विक संसाधन के लिए काम नहीं करेगा, मैंने इसे तुरंत चालू कर दिया है और खाली गुणों के साथ डेटास्रोत प्राप्त किया है (वर्ग = "", url = null)। लेकिन यदि आपके पास स्थानीय रूप से परिभाषित संसाधन के साथ सेटअप सेटअप है, तो मैं अंदर हूं। मैंने शुरुआत में इसे आजमाया है। –

+0

@binary_runner: पर्याप्त ध्यान नहीं दिया, ध्यान नहीं दिया कि संसाधन वैश्विक था। और हाँ, मेरे पास स्थानीय रूप से परिभाषित संसाधन के साथ एक कार्य सेटअप है, इसे बाद में पोस्ट करेगा (इस कंप्यूटर पर नहीं)। –

+0

धन्यवाद। मुझे अभी भी क्या गलत नहीं मिल रहा है, सब कुछ ठीक दिखता है लेकिन लुकअप विफल हो जाता है :( –

1

(Tomcat7 में अपाचे OpenJPA लाइब्रेरी का उपयोग कर इम इतना सामान हाइबरनेट से मेल नहीं कर सकते हैं)

मैं अपने OpenJPA webapps के लिए एक वैश्विक JDBC इस्तेमाल नहीं किया है, लेकिन यह एक कोशिश दे दी है। यह काम किया और यह मेरी विन्यास है। फ़ोल्डर देखें जहां persistence.xml बचाया गया है, शायद ओपनजेपीए समस्या है लेकिन इसके बिना कुछ भी काम नहीं करता है।

MyApp/वेब-INF/वर्गों/META-INF/persistence.xml
इस openjpa प्रदाता उपयोग कर रहा है तो कक्षा सूची हाइबरनेट में की जरूरत नहीं हो सकती है।

<?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"> 

<persistence-unit name="main" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <non-jta-data-source>java:comp/env/jdbc/mydb</non-jta-data-source> 

    <class>com.myapp.db.User</class> 
    <class>com.myapp.db.Server</class> 

    <properties> 
     <property name="openjpa.DynamicEnhancementAgent" value="false" /> 
     <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" /> 
     <property name="openjpa.Log" value="commons" /> 
     <property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" /> 
    </properties> 
</persistence-unit> 

</persistence> 

बिल्ला/conf/server.xml
वैश्विक JDBC संसाधन जोड़ें।

..cut... 
    <GlobalNamingResources> 
    <Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
       description="User database that can be updated and saved" 
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" readonly="true" /> 

    <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" 
     maxActive="100" maxIdle="20" maxWait="10000" 
     username="myuser" password="mypwd" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf8" 
     validationQuery="SELECT 1" removeAbandoned="true" removeAbandonedTimeout="300" 
    /> 
    </GlobalNamingResources> 
    ..cut... 

बिल्ला/conf/कैटालिना/स्थानीय होस्ट/myapp.xml
यह मेरा विकास बॉक्स तो मैं docBase परियोजनाओं फ़ोल्डर से सीधे लिंक का उपयोग करें। उत्पादन बॉक्स में तैनात किए जाने पर आपको इसे युद्ध पैकेज (मेटा-आईएनएफ/संदर्भ.एक्सएमएल) में डालना चाहिए।

<?xml version="1.0" encoding="UTF-8"?> 
<Context docBase="/projects/myapp/web" reloadable="true" crossContext="true" > 

    <Realm className="org.apache.catalina.realm.DataSourceRealm" 
    dataSourceName="jdbc/mydb" localDataSource="false" digest="SHA" 
    userTable="user"   userNameCol="username" userCredCol="password" 
    userRoleTable="user_role_v" roleNameCol="role" 
    /> 

    <ResourceLink name="jdbc/mydb" global="jdbc/mydb" type="javax.sql.DataSource" /> 
</Context> 

MyApp/वेब-INF/web.xml
जोड़ें संसाधन रेफरी फ़ाइल के अंत तक।

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0" > 

    <description>Webapp</description> 
    <display-name>Webapp</display-name> 
    ..cut... 

    <resource-ref> 
    <description>mydb</description> 
    <res-ref-name>jdbc/mydb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 

</web-app> 

क्योंकि का उपयोग कर इम OpenJPA + Tomcat7 (नहीं fullsized J2EE कंटेनर) इस overengineering लेकिन thats यह कैसे काम करता दिख सकता है। परिणाम अच्छे हैं और डीबी-जागरूक वेबपैप्स विकसित करना बहुत आसान है। मैन्युअल एसक्यूएल क्वेरी हार्डकोडिंग और oldskool डीएओ कक्षाओं की कोई ज़रूरत नहीं है।

+0

क्या आप स्पष्टीकरण दे सकते हैं कि आपने कैसे एकीकृत किया ओपनजेपीए के साथ वेबपैप। मेरे पास ओपनईजेबी के साथ एक लाइफरे पोर्टलेट है और मुझे अभी भी त्रुटि मिल रही है javax.persistence.PersistenceException: एंटर मैनेजर के लिए कोई पर्सिस्टेंस प्रदाता kepler_v1PU नामक मेरे पास जीवनकाल 6.1 टॉमकैट 7 के साथ बंडल है और मैं अपने प्रोजेक्ट में ओपनईजेबी जोड़ता हूं Maven निर्भरता org.apache.openejb javaee-api 6.0-5 मैं इसे अलग प्रश्न के निकाल सकते हैं, लेकिन मैं पहले से ही simila लगता है एसओ पर आर। – user3057486

+0

मुझे ट्रिक्स का वर्णन करने के लिए बाद में एक लंबा उत्तर पोस्ट करने की आवश्यकता है कि कैसे जेपीए + ओपनजेपीए + ऑटोमोनेजेम का उपयोग शुद्ध टोमकैट वेबपैप में किया जाता है। कुंजी मुझे यह मिला था (अब अप्रचलित) सहायक lib https://code.google.com/p/scoped-entitymanager/। मैंने इसे JPA2.x इंटरफ़ेस के साथ काम करने के लिए संशोधित किया। यह servlethttprequest स्कोप के भीतर एक ऑटो-प्रबंधित जेपीए इकाई प्रबंधक प्रदान करता है। लिफ़ेरे पोर्टल एक मुद्दा है जिसे मैं नहीं जानता। – Whome

+0

अंत में मैंने यह किया और स्रोत कोड पोस्ट किया, यह टोपीकैट सर्वलेट कंटेनर के लिए जेपीए 2.एक्स संगत रैपर है। Automanage इकाई प्रबंधक https://github.com/Murmur/ScopedEntityManager – Whome

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^