مرحبًا بك في درس مثال Tomcat DataSource JNDI. لقد نظرنا في مصدر بيانات JDBC في الدرس السابق وتعلمنا كيفية استخدامه في تطبيق Java مستقل.
Tomcat DataSource JNDI
الفائدة الفعلية لـ DataSource تأتي عندما نستخدمه مع سياق JNDI. على سبيل المثال، حوض الاتصال في تطبيق الويب المنشور في حاوية servlet. يوفر معظم حاويات servlet الشهيرة الدعم المدمج لـ DataSource من خلال تكوين الموارد وسياق JNDI. يساعدنا هذا في إنشاء واستخدام حوض اتصال DataSource بمجرد بضعة أسطر من التكوين. يهدف هذا الدرس إلى توفير مثال على تكوين Tomcat DataSource JNDI. يوفر Apache Tomcat ثلاث طرق لتكوين DataSource في سياق JNDI.
- ملف context.xml للتطبيق – هذه هي الطريقة الأسهل لتكوين مصدر البيانات، كل ما نحتاجه هو ملف context.xml في دليل META-INF. علينا تعريف عنصر المورد في ملف السياق وسيهتم الحاوي بتحميله وتكوينه. النهج بسيط ولكن لديه بعض العيوب؛
- نظرًا لأن ملف السياق مضمن مع ملف WAR، علينا بناء WAR جديد ونشره لكل تغيير صغير في التكوين. نفس المشكلة تنشأ إذا كان تطبيقك يعمل في بيئة موزعة أو إذا كان تطبيقك يحتاج إلى نشره في بيئات اختبار مختلفة مثل QA، IT، PROD الخ.
- يتم إنشاء مصدر البيانات من قبل الحاوية لاستخدام التطبيق فقط، لذا لا يمكن استخدامه على نطاق عالمي. لا يمكننا مشاركة مصدر البيانات عبر تطبيقات متعددة.
- إذا كان هناك مصدر بيانات عالمي (server.xml) معرف بنفس الاسم، يتم تجاهل مصدر البيانات التطبيقي.
- ملف context.xml للخادم – إذا كانت هناك عدة تطبيقات في الخادم وترغب في مشاركة مصدر البيانات عبرها، يمكننا تحديد ذلك في ملف context.xml للخادم. يقع هذا الملف في دليل
apache-tomcat/conf
. نطاق ملف context.xml للخادم هو التطبيق، لذا إذا قمت بتعريف حوض اتصال DataSource يحتوي على 100 اتصال وكانت هناك 20 تطبيقًا، فسيتم إنشاء مصدر بيانات لكل تطبيق. وهذا سيؤدي إلى إنشاء 2000 اتصال بالطبع سيستهلك كل موارد خادم قاعدة البيانات ويؤثر على أداء التطبيق. - ملف server.xml و context.xml – يمكننا تحديد مصدر البيانات على مستوى عالمي من خلال تحديدها في عنصر
GlobalNamingResources
في ملف server.xml. إذا استخدمنا هذا النهج، فعلينا تعريفResourceLink
من ملف context.xml للخادم أو تحديد التطبيق. هذه هي الطريقة المفضلة عندما ترغب في مشاركة حوض موارد مشترك عبر عدة تطبيقات تعمل على الخادم. بالنسبة لرابط المصدر، سواء كان تعريفه على مستوى خادم في ملف context xml أو على مستوى تطبيق، يعتمد ذلك على متطلباتك.
لنلق نظرة على مثال JNDI DataSource في Tomcat لتطبيقات الويب باستخدام جافا. بالنسبة لإعداد بيانات الاختبار، يرجى الرجوع إلى مقالي السابق حول مثال JDBC DataSource.
مثال على تكوين JNDI لمصدر بيانات Tomcat – ملف server.xml
أضف الكود أدناه في ملف server.xml لخادم Tomcat. يجب أن يتم إضافة الكود في عنصر GlobalNamingResources
. تأكد أيضًا من وجود مشغل قاعدة البيانات في دليل مكتبة Tomcat. في هذه الحالة، يجب أن يكون ملف جرار mysql jdbc موجودًا في مكتبة Tomcat.
<Resource name="jdbc/MyDB"
global="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/UserDB"
username="pankaj"
password="pankaj123"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
هنا نقوم بإنشاء سياق JNDI بالاسم jdbc/MyDB
وهو نوع من مصدر البيانات. نقوم بتمرير تكوينات قاعدة البيانات في السمة url واسم المستخدم وكلمة المرور و driverClassName. تتم تعريف خصائص تجمع الاتصال في السمات maxActive و maxIdle و minIdle.
تكوين رابط مصدر بيانات Tomcat JNDI – ملف context.xml
أضف الكود أدناه في ملف context.xml للخادم.
<ResourceLink name="jdbc/MyLocalDB"
global="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource" />
لاحظ أن اسم رابط المورد مختلف عن الرابط العام، يجب علينا استخدام هذا الاسم في برنامجنا الجافا للحصول على مصدر البيانات.
مثال JNDI لمصدر بيانات Tomcat
أنشئ تطبيق ويب ديناميكي باسم JDBCDataSourceTomcat ثم أنشئ Servlet بالكود التالي.
package com.journaldev.jdbc.datasource;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
@WebServlet("/JDBCDataSourceExample")
public class JDBCDataSourceExample extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Context ctx = null;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
con = ds.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery("select empid, name from Employee");
PrintWriter out = response.getWriter();
response.setContentType("text/html");
out.print("Employee Details
");
out.print("");
out.print("Employee ID ");
out.print("Employee Name ");
while(rs.next())
{
out.print("");
out.print("" + rs.getInt("empid") + " ");
out.print("" + rs.getString("name") + " ");
out.print(" ");
}
out.print("
");
// دعنا نطبع بعض معلومات قاعدة البيانات
out.print("Database Details
");
out.print("Database Product: "+con.getMetaData().getDatabaseProductName()+"
");
out.print("Database Driver: "+con.getMetaData().getDriverName());
out.print("");
}catch(NamingException e){
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
stmt.close();
con.close();
ctx.close();
} catch (SQLException e) {
System.out.println("Exception in closing DB resources");
} catch (NamingException e) {
System.out.println("Exception in closing Context");
}
}
}
}
لاحظ أنني استخدم تكوين الإعلان عن Servlet 3 بالتعليقات وسيعمل في Tomcat 7 أو الإصدارات الأحدث. إذا كنت تستخدم إصدارًا أقدم من Tomcat ، فيجب عليك إجراء بعض التعديلات على كود السيرفلت لإزالة تعليق WebServlet وتكوينه في ملف web.xml. الجزء من كود السيرفلت الذي نهتم به؛
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/MyLocalDB");
هذه هي الطريقة للحصول على موارد JNDI المعرفة لاستخدامها في التطبيق. كان بإمكاننا كتابته بهذه الطريقة أيضًا؛
ctx = new InitialContext();
Context initCtx = (Context) ctx.lookup("java:/comp/env");
DataSource ds = (DataSource) initCtx.lookup("jdbc/MyLocalDB");
I am also printing some database information to check which database we are connected. Now when you will run the application, you will see following output. Let’s see how easy it is to switch the database server because we are using Tomcat DataSource. All you need is to change the Database properties. So if we have to switch to Oracle database, my Resource configuration will look like below.
<Resource name="jdbc/MyDB"
global="jdbc/MyDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"
username="hr"
password="oracle"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>
وعند إعادة تشغيل الخادم وتشغيل التطبيق، سيتم الاتصال بقاعدة بيانات Oracle وإنتاج النتيجة أدناه. هذا كل شيء بالنسبة لمثال تكوين Tomcat DataSource JNDI ، يمكنك تحديد المورد بنفس الطريقة في ملفات context.xml أيضًا.
Source:
https://www.digitalocean.com/community/tutorials/tomcat-datasource-jndi-example-java