سؤال

أقوم بتطوير تطبيق Java Servlet Web الذي يدير المعلومات من قواعد بيانات متعددة (كل ذلك من الناحية الهيكلية) لكل منها مقابلة "أعمال" مختلفة. يختار المستخدم "الأعمال الحالية" التي يتم تخزينها في الجلسة ويمكن للتطبيق عرض أو تعديل هذا "الأعمال الحالية".

أرغب في استخدام موارد Tomcat بطريقة ديناميكية للحصول على هذه الشركات باستخدام JNDI. وبهذه الطريقة، يمكنني استخدام علامات JSTL SQL أو البحث في السياق في Servlets. لا أستطيع تحديد كل مورد في ملف Web.xml لأنه يتم تخزينه في جدول SQL. النتيجة النهائية هي أن تكون قادرا على كتابة JSP بسيطة تحتوي على خطوط مثل هذه:

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<sql:query var = "users" dataSource="sources/${sessionScope.currentBusiness}">
  select id, firstName, lastName FROM user
</sql:query>

أو servlets التي يمكن أن يكون لها خطوط مثل هذه

String request.getSession().getAttribute("currentBusiness");

Context initial = new InitialContext();
Context context = (Context) initial.lookup("java:comp/env");
DataSource source = (DataSource) context.lookup("sources/" + currentBusiness);

حيث يمكنني الحصول على مصدر البيانات الصحيح ل "الأعمال الحالية".

لقد جربت كتابة موضوعي المستمد من javax.naming.spi.pjectory دون نجاح. أي مؤشرات حول كيفية القيام بذلك بسهولة؟

هل كانت مفيدة؟

المحلول

لقد استقرت أخيرا للحل التالي الذي يتألف في SessionListener و Servlet الذي يعمل على النحو التالي. يحتوي SessionListener على النموذج التالي:

public class SessionListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event) {

    HttpSession session = event.getSession();

    // get list of possible data sources available to this session
    List<DataSource> sources = new ArrayList<DataSource>();
    ... code to get the available sources

    // get the current data source
    DataSource source = null;
    ... code to get the current source                               
    source = sources.get(0); // for example

    // setup the session attributes
    session.setAttribute("availableSources", sources);
    session.setAttribute("currentSource", source); 

  }

}

كلما تم إنشاء سجل مستخدم ويتم إنشاء جلسة، يتم وضع قائمة البيانات الخاصة ب DataSources المتاحة، والآخر، في الجلسة. يتم ذلك في مستوى الجلسة لأن DataSources تعتمد على تسجيل دخول المستخدم. أصبح من الممكن الآن الوصول إليهم من داخل التطبيق. لتغيير DataSource الحالي، قمت بإنشاء Servlet مع هذا الإصدار المبسط:

public abstract class BoxletServlet extends HttpServlet {

  protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {

    HttpSession session = request.getSession(true);
    String s = request.getParameter("source");

    // based on 's' choose from the available DataSource
    List<DataSource> sources = (List<DataSource>) session.getParameter("availableSources");
    Source source = chooseFrom(sources, s);                                                       
    session.setParameter("currentSource", source);          

    // forward to a page saying that the DataSource changed

  }

}

من خلال هذا التطبيق، أصبح من الممكن الآن إنشاء JSPS التالية:

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<sql:query var = "users" dataSource="${sessionScope.currentSource}">
  select id, firstName, lastName FROM user
</sql:query>

آمل أن يساعد شخص آخر.

نصائح أخرى

إنشاء مصادر البيانات في Servletcontextener. ووضعها في servletcontext..

سيكون هذا النهج بالتأكيد "العمل"، ولكن مفهوم قاعدة بيانات منفصلة ومتطلعة لكل أعمال تبدو خاطئة بالنسبة لي. بالتأكيد القدرة على تحرير الأعمال في مكان ما في المخطط يبدو ممكنا. يتطلب فصلهم بهذه الطريقة قاعدة بيانات جديدة لكل شركة، حيث سيطلب المخطط فقط معرف تجاري جديد.

أود أيضا أن أجادل أن أي إمكانية لضيع أي إمكانية تعدين البيانات عبر الأعمال، إلا إذا كنت بيانات ETL من قواعد بيانات منفصلة في مكعب ثنائي الأبعاد للإبلاغ عن المخصص واستعلامه.

و jstl.u003Csql> يجب أن تستخدم العلامات فقط في أبسط تطبيقات الويب. تترك نفسك مفتوحا في إمكانية هجمات حقن SQL عند التحقق من الصحة على المستوى المتوسط.

تحديث:

يجب أن تعلن الموارد في Web.xml Afaik الخاص بك، لذلك كلما كان لديك قاعدة بيانات جديدة، عليك إيقاف التطبيق، وتكوين مصدر JNDI الجديد، وإعادة تشغيل Tomcat. آمل أن تكون متجمعا، لأن جميع العملاء السابقين سوف يتأثرون بالتطبيق في كل مرة تقوم فيها بإضافة أعمال / قاعدة بيانات جديدة.

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