الطريقة الصحيحة لجعل موارد البيانات/الموارد إعداد وقت النشر

StackOverflow https://stackoverflow.com/questions/2343976

سؤال

لدي تطبيق ويب يتطلب إعدادين:

  • A JDBC DataSource
  • رمز سلسلة

أريد بشدة أن أكون قادرًا على نشر واحد. war إلى حاويات مختلفة مختلفة (jetty ، tomcat ، gf3 minimity) وتكوين هذه الإعدادات على مستوى التطبيق داخل الحاوية.

الكود الخاص بي يفعل هذا:

InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")

دعنا نفترض أنني استخدمت واجهة إدارة Glassfish لإنشاء اثنين من الموارد JDBC: JDBC/اختبار datasource و jdbc/live-datasource التي تتصل بنسخ مختلفة من المخطط نفسه ، على خوادم مختلفة ، وبيانات اعتماد مختلفة ، إلخ. هذا إلى Glassfish معه وإشارةه إلى DataSource اختبار ، قد يكون لدي هذا في Sun-Web.xml:

...
<resource-ref>
  <res-ref-name>jdbc/datasource</res-ref-name>
  <jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...

لكن

  • Sun-Web.xml يذهب داخل حربتي ، أليس كذلك؟
  • بالتأكيد يجب أن تكون هناك طريقة للقيام بذلك من خلال واجهة الإدارة

هل أحاول حتى أن أفعل الشيء الصحيح؟ هل تجعل الحاويات الأخرى هذا أسهل؟ سأكون مهتمًا بشكل خاص بكيفية تعامل Jetty 7 مع هذا لأنني أستخدمه للتطوير.

تعديل Tomcat لديه طريقة معقولة للقيام بذلك:

خلق $TOMCAT_HOME/conf/Catalina/localhost/webapp.xml مع:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
  <!-- String resource -->
  <Environment name="token" value="value of token" type="java.lang.String" override="false" />

  <!-- Linking to a global resource -->
  <ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />

  <!-- Derby -->
  <Resource name="jdbc/datasource2"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
    url="jdbc:derby:test;create=true"
    />

  <!-- H2 -->
  <Resource name="jdbc/datasource3"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.h2.jdbcx.JdbcDataSource"
    url="jdbc:h2:~/test"
    username="sa"
    password=""
    />
</Context>

لاحظ أن override="false" يعني العكس. وهذا يعني أن هذا الإعداد لا يمكن تجاوزه بواسطة web.xml.

أحب هذا النهج لأن الملف جزء من وعاء التكوين ليس الحرب ، لكنها ليست جزءًا من التكوين العالمي ؛ إنه WebApp محدد.

أعتقد أنني أتوقع المزيد من Glassfish لأنه من المفترض أن يكون لديه واجهة مسؤول ويب كاملة ، لكنني سأكون سعيدًا بما يكفي مع شيء مكافئ لما ورد أعلاه.

لا يوجد حل صحيح

نصائح أخرى

بالنسبة لـ GF V3 ، قد ترغب في محاولة الاستفادة من خيار -deploymentplan للملاحظة الفرعية النشر لـ Asadmin. تمت مناقشته على صفحة الرجل للوحدة الفرعية النشر.

واجهت نفس المشكلة أيضا، وهنا كيف حلها.

الأعراض

لست متأكدًا من فهم السؤال/المشكلة حقًا.

ك مكون مكون التطبيق, ، تعلن عن الموارد (الموارد) المطلوبة من خلال طلبك في طريقة قياسية (حاوية لاأدري) في web.xml.

في وقت النشر ، ناقل الطلب والمسؤول من المفترض أن يتبع التعليمات التي قدمتها مكون مكون التطبيق لحل التبعيات الخارجية (من بين أشياء أخرى) على سبيل المثال عن طريق إنشاء مصدر بيانات على مستوى خادم التطبيق ورسم خرائط اسم JNDI الحقيقي إلى اسم المورد الذي يستخدمه التطبيق من خلال استخدام واصف نشر خادم التطبيق (على سبيل المثال sun-web.xml للسمك الزجاجي). من الواضح أن هذا أ حاوية محددة الخطوة وبالتالي لا تغطيها مواصفات Java EE.

الآن ، إذا كنت ترغب في تغيير قاعدة البيانات التي يستخدمها التطبيق ، فسيتعين عليك إما:

  • قم بتغيير التعيين في واصف نشر خادم التطبيق - أو -
  • قم بتعديل تكوين مصدر البيانات الموجود لجعله نقاطًا على قاعدة بيانات أخرى.

وجود واجهة المسؤول لا يغير أي شيء حقًا. إذا فاتني شيء ما ، لا تتردد في إخباري. وفقط في حالة هذه الإجابة السابقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top