إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
هام
لم يعد Azure Cosmos DB ل PostgreSQL مدعوما للمشاريع الجديدة. لا تستخدم هذه الخدمة لمشاريع جديدة. بدلا من ذلك، استخدم إحدى هاتين الخدمتين:
استخدم Azure Cosmos DB ل NoSQL لحل قاعدة بيانات موزعة مصمم للسيناريوهات عالية النطاق مع اتفاقية مستوى خدمة توفر 99.999% (SLA) والتحجيم التلقائي الفوري وتجاوز الفشل التلقائي عبر مناطق متعددة.
استخدم ميزة المجموعات المرنة في قاعدة بيانات Azure ل PostgreSQL المجزأة باستخدام ملحق Citus مفتوح المصدر.
يوضح لك هذا التشغيل السريع كيفية استخدام تعليمات Java البرمجية للاتصال بمجموعة، واستخدام عبارات SQL لإنشاء جدول. ستقوم بعد ذلك بإدراج البيانات والاستعلام عنها وتحديثها وحذفها في قاعدة البيانات. تفترض الخطوات الواردة في هذه المقالة أنك على دراية بتطوير Java وJDBC، وأنك جديد في العمل مع Azure Cosmos DB ل PostgreSQL.
إعداد مشروع Java والاتصال
إنشاء مشروع Java جديد وملف تكوين للاتصال ب Azure Cosmos DB ل PostgreSQL.
إنشاء مشروع Java جديد
باستخدام بيئة التطوير المتكاملة المفضلة لديك (IDE)، قم بإنشاء مشروع Java جديد باستخدام groupId test و artifactId crud. في الدليل الجذر للمشروع، أضف ملف pom.xml بالمحتويات التالية. يقوم هذا الملف بتكوين Apache Maven لاستخدام Java 8 وبرنامج تشغيل PostgreSQL حديث ل Java.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>crud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>crud</name>
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</plugin>
</plugins>
</build>
</project>
تكوين اتصال قاعدة البيانات
في src/main/resources/، قم بإنشاء ملف application.properties بالمحتويات التالية. استبدل <نظام المجموعة> باسم نظام المجموعة الخاص بك، واستبدل <كلمة المرور> بكلمة المرور الإدارية أو الرمز المميز لمعرف Microsoft Entra.
driver.class.name=org.postgresql.Driver
db.url=jdbc:postgresql://c-<cluster>.<uniqueID>.postgres.cosmos.azure.com:5432/citus?ssl=true&sslmode=require
db.username=citus
db.password=<password>
?ssl=true&sslmode=require تخبر السلسلة في الخاصية db.url برنامج تشغيل JDBC باستخدام بروتوكول أمان طبقة النقل (TLS) عند الاتصال بقاعدة البيانات. من الضروري استخدام TLS مع Azure Cosmos DB ل PostgreSQL، وهي ممارسة أمان جيدة.
إنشاء جداول
تكوين مخطط قاعدة بيانات يحتوي على جداول موزعة. اتصل بقاعدة البيانات لإنشاء المخطط والجداول.
إنشاء مخطط قاعدة البيانات
في src/main/resources/، قم بإنشاء ملف schema.sql بالمحتويات التالية:
DROP TABLE IF EXISTS public.pharmacy;
CREATE TABLE public.pharmacy(pharmacy_id integer,pharmacy_name text ,city text ,state text ,zip_code integer);
CREATE INDEX idx_pharmacy_id ON public.pharmacy(pharmacy_id);
توزيع الجداول
يمنحك Azure Cosmos DB ل PostgreSQL القوة الفائقة لتوزيع الجداول عبر عقد متعددة لقابلية التوسع. يمكنك الأمر أدناه من توزيع جدول. يمكنك معرفة المزيد حول create_distributed_tableعمود التوزيع هنا.
إشعار
يتيح لهم توزيع الجداول النمو عبر أي عقد عاملة تمت إضافتها إلى نظام المجموعة.
لتوزيع الجداول، قم بإلحاق السطر التالي بملف schema.sql الذي أنشأته في القسم السابق.
select create_distributed_table('public.pharmacy','pharmacy_id');
الاتصال بقاعدة البيانات وإنشاء المخطط
بعد ذلك، أضف تعليمة Java البرمجية التي تستخدم JDBC لتخزين البيانات واستردادها من مجموعتك. تستخدم التعليمات البرمجية application.properties وملفات schema.sql للاتصال بالمجموعة وإنشاء المخطط.
إنشاء ملف DButil.java مع التعليمات البرمجية
DButilالتالية، والتي تحتوي على الفئة . تعد فئةDBUtilتجمع اتصال إلى PostgreSQL باستخدام HikariCP. يمكنك استخدام هذه الفئة للاتصال ب PostgreSQL وبدء الاستعلام.تلميح
يستخدم نموذج التعليمات البرمجية أدناه مجموعة اتصال لإنشاء اتصالات إلى PostgreSQL وإدارتها. يوصى بشدة بمجموعة الاتصال من جانب التطبيق لأن:
- ويضمن أن التطبيق لا ينشئ اتصالات كثيرة جدًا بقاعدة البيانات، وبالتالي يتجنب تجاوز حدود الاتصال.
- يمكن أن يساعد على تحسين الأداء بشكل كبير - كل من زمن الانتقال ومعدل النقل. يجب أن تتشعب عملية خادم PostgreSQL لمعالجة كل اتصال جديد، وأن تتجنب إعادة استخدام الاتصال هذا الحمل.
//DButil.java package test.crud; import java.io.FileInputStream; import java.io.IOException; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import com.zaxxer.hikari.HikariDataSource; public class DButil { private static final String DB_USERNAME = "db.username"; private static final String DB_PASSWORD = "db.password"; private static final String DB_URL = "db.url"; private static final String DB_DRIVER_CLASS = "driver.class.name"; private static Properties properties = null; private static HikariDataSource datasource; static { try { properties = new Properties(); properties.load(new FileInputStream("src/main/java/application.properties")); datasource = new HikariDataSource(); datasource.setDriverClassName(properties.getProperty(DB_DRIVER_CLASS )); datasource.setJdbcUrl(properties.getProperty(DB_URL)); datasource.setUsername(properties.getProperty(DB_USERNAME)); datasource.setPassword(properties.getProperty(DB_PASSWORD)); datasource.setMinimumIdle(100); datasource.setMaximumPoolSize(1000000000); datasource.setAutoCommit(true); datasource.setLoginTimeout(3); } catch (IOException | SQLException e) { e.printStackTrace(); } } public static DataSource getDataSource() { return datasource; } }في src/main/java/، قم بإنشاء ملف DemoApplication.java يحتوي على التعليمات البرمجية التالية:
package test.crud; import java.io.IOException; import java.sql.*; import java.util.*; import java.util.logging.Logger; import java.io.FileInputStream; import java.io.FileOutputStream; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; import java.io.IOException; import java.io.Reader; import java.io.StringReader; public class DemoApplication { private static final Logger log; static { System.setProperty("java.util.logging.SimpleFormatter.format", "[%4$-7s] %5$s %n"); log =Logger.getLogger(DemoApplication.class.getName()); } public static void main(String[] args)throws Exception { log.info("Connecting to the database"); Connection connection = DButil.getDataSource().getConnection(); System.out.println("The Connection Object is of Class: " + connection.getClass()); log.info("Database connection test: " + connection.getCatalog()); log.info("Creating table"); log.info("Creating index"); log.info("distributing table"); Scanner scanner = new Scanner(DemoApplication.class.getClassLoader().getResourceAsStream("schema.sql")); Statement statement = connection.createStatement(); while (scanner.hasNextLine()) { statement.execute(scanner.nextLine()); } log.info("Closing database connection"); connection.close(); } }إشعار
يتم استخدام قاعدة البيانات
userوبياناتpasswordالاعتماد عند تنفيذDriverManager.getConnection(properties.getProperty("url"), properties);. يتم تخزين بيانات الاعتماد في ملف application.properties ، والذي يتم تمريره كوسيطة.يمكنك الآن تنفيذ هذه الفئة الرئيسة باستخدام الأداة المفضلة لديك:
- باستخدام IDE الخاص بك، يجب أن تكون قادرا على النقر بزر الماوس الأيمن
DemoApplicationفوق الفئة وتنفيذها. - باستخدام Maven، يمكنك تشغيل التطبيق عن طريق تنفيذ:
mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".
- باستخدام IDE الخاص بك، يجب أن تكون قادرا على النقر بزر الماوس الأيمن
يجب أن يتصل التطبيق ب Azure Cosmos DB ل PostgreSQL، وأنشئ مخطط قاعدة بيانات، ثم أغلق الاتصال، كما يجب أن تشاهد في سجلات وحدة التحكم:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Create database schema
[INFO ] Closing database connection
إنشاء فئة المجال
إنشاء Pharmacy فئة Java جديدة، بجانب DemoApplicationالفئة، وإضافة التعليمة البرمجية التالية:
public class Pharmacy {
private Integer pharmacy_id;
private String pharmacy_name;
private String city;
private String state;
private Integer zip_code;
public Pharmacy() { }
public Pharmacy(Integer pharmacy_id, String pharmacy_name, String city,String state,Integer zip_code)
{
this.pharmacy_id = pharmacy_id;
this.pharmacy_name = pharmacy_name;
this.city = city;
this.state = state;
this.zip_code = zip_code;
}
public Integer getpharmacy_id() {
return pharmacy_id;
}
public void setpharmacy_id(Integer pharmacy_id) {
this.pharmacy_id = pharmacy_id;
}
public String getpharmacy_name() {
return pharmacy_name;
}
public void setpharmacy_name(String pharmacy_name) {
this.pharmacy_name = pharmacy_name;
}
public String getcity() {
return city;
}
public void setcity(String city) {
this.city = city;
}
public String getstate() {
return state;
}
public void setstate(String state) {
this.state = state;
}
public Integer getzip_code() {
return zip_code;
}
public void setzip_code(Integer zip_code) {
this.zip_code = zip_code;
}
@Override
public String toString() {
return "TPharmacy{" +
"pharmacy_id=" + pharmacy_id +
", pharmacy_name='" + pharmacy_name + '\'' +
", city='" + city + '\'' +
", state='" + state + '\'' +
", zip_code='" + zip_code + '\'' +
'}';
}
}
هذه الفئة هي نموذج لمجال معين في جدول Pharmacy الذي قمت بإنشائه عند تنفيذ البرنامج النصي schema.sql.
إدراج بيانات
في ملف DemoApplication.java ، بعد main الأسلوب ، أضف الأسلوب التالي الذي يستخدم عبارة INSERT INTO SQL لإدراج البيانات في قاعدة البيانات:
private static void insertData(Pharmacy todo, Connection connection) throws SQLException {
log.info("Insert data");
PreparedStatement insertStatement = connection
.prepareStatement("INSERT INTO pharmacy (pharmacy_id,pharmacy_name,city,state,zip_code) VALUES (?, ?, ?, ?, ?);");
insertStatement.setInt(1, todo.getpharmacy_id());
insertStatement.setString(2, todo.getpharmacy_name());
insertStatement.setString(3, todo.getcity());
insertStatement.setString(4, todo.getstate());
insertStatement.setInt(5, todo.getzip_code());
insertStatement.executeUpdate();
}
أضف الخطين التاليين في الأسلوب الرئيسي:
Pharmacy todo = new Pharmacy(0,"Target","Sunnyvale","California",94001);
insertData(todo, connection);
يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Creating table
[INFO ] Creating index
[INFO ] distributing table
[INFO ] Insert data
[INFO ] Closing database connection
اقرأ البيانات
اقرأ البيانات التي قمت بإدراجها مسبقا للتحقق من أن التعليمات البرمجية تعمل بشكل صحيح.
في ملف DemoApplication.java ، بعد insertData الأسلوب ، أضف الأسلوب التالي الذي يستخدم عبارة SELECT SQL لقراءة البيانات من قاعدة البيانات:
private static Pharmacy readData(Connection connection) throws SQLException {
log.info("Read data");
PreparedStatement readStatement = connection.prepareStatement("SELECT * FROM Pharmacy;");
ResultSet resultSet = readStatement.executeQuery();
if (!resultSet.next()) {
log.info("There is no data in the database!");
return null;
}
Pharmacy todo = new Pharmacy();
todo.setpharmacy_id(resultSet.getInt("pharmacy_id"));
todo.setpharmacy_name(resultSet.getString("pharmacy_name"));
todo.setcity(resultSet.getString("city"));
todo.setstate(resultSet.getString("state"));
todo.setzip_code(resultSet.getInt("zip_code"));
log.info("Data read from the database: " + todo.toString());
return todo;
}
أضف السطر التالي في الأسلوب الرئيسي:
todo = readData(connection);
يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Creating table
[INFO ] Creating index
[INFO ] distributing table
[INFO ] Insert data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Sunnyvale', state='California', zip_code='94001'}
[INFO ] Closing database connection
تحديث البيانات
تحديث البيانات التي قمت بإدراجها مسبقا.
لا يزال في ملف DemoApplication.java ، بعد readData الأسلوب ، أضف الأسلوب التالي لتحديث البيانات داخل قاعدة البيانات باستخدام عبارة UPDATE SQL:
private static void updateData(Pharmacy todo, Connection connection) throws SQLException {
log.info("Update data");
PreparedStatement updateStatement = connection
.prepareStatement("UPDATE pharmacy SET city = ? WHERE pharmacy_id = ?;");
updateStatement.setString(1, todo.getcity());
updateStatement.setInt(2, todo.getpharmacy_id());
updateStatement.executeUpdate();
readData(connection);
}
أضف الخطين التاليين في الأسلوب الرئيسي:
todo.setcity("Guntur");
updateData(todo, connection);
يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Creating table
[INFO ] Creating index
[INFO ] distributing table
[INFO ] Insert data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Sunnyvale', state='California', zip_code='94001'}
[INFO ] Update data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Guntur', state='California', zip_code='94001'}
[INFO ] Closing database connection
حذف البيانات
وأخيرا، احذف البيانات التي قمت بإدراجها مسبقا. لا يزال في ملف DemoApplication.java ، بعد updateData الأسلوب ، أضف الأسلوب التالي لحذف البيانات داخل قاعدة البيانات باستخدام عبارة DELETE SQL:
private static void deleteData(Pharmacy todo, Connection connection) throws SQLException {
log.info("Delete data");
PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM pharmacy WHERE pharmacy_id = ?;");
deleteStatement.setLong(1, todo.getpharmacy_id());
deleteStatement.executeUpdate();
readData(connection);
}
يمكنك الآن إضافة السطر التالي في الأسلوب الرئيسي:
deleteData(todo, connection);
يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Creating table
[INFO ] Creating index
[INFO ] distributing table
[INFO ] Insert data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Sunnyvale', state='California', zip_code='94001'}
[INFO ] Update data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Guntur', state='California', zip_code='94001'}
[INFO ] Delete data
[INFO ] Read data
[INFO ] There is no data in the database!
[INFO ] Closing database connection
أمر COPY للاستيعاب السريع
يمكن أن ينتج عن أمر COPY إنتاجية هائلة أثناء استيعاب البيانات في Azure Cosmos DB ل PostgreSQL. يمكن لأمر COPY استيعاب البيانات في الملفات، أو من دفعات صغيرة من البيانات في الذاكرة لاستيعابها في الوقت الحقيقي.
الأمر COPY لتحميل البيانات من ملف
تنسخ التعليمات البرمجية التالية البيانات من ملف CSV إلى جدول قاعدة بيانات. يتطلب نموذج التعليمات البرمجية pharmacies.csv الملف.
public static long
copyFromFile(Connection connection, String filePath, String tableName)
throws SQLException, IOException {
long count = 0;
FileInputStream fileInputStream = null;
try {
Connection unwrap = connection.unwrap(Connection.class);
BaseConnection connSec = (BaseConnection) unwrap;
CopyManager copyManager = new CopyManager((BaseConnection) connSec);
fileInputStream = new FileInputStream(filePath);
count = copyManager.copyIn("COPY " + tableName + " FROM STDIN delimiter ',' csv", fileInputStream);
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return count;
}
يمكنك الآن إضافة السطر التالي في الأسلوب الرئيسي:
int c = (int) copyFromFile(connection,"C:\\Users\\pharmacies.csv", "pharmacy");
log.info("Copied "+ c +" rows using COPY command");
تنفيذ الفئة main يجب الآن تشغيل المخرجات التالية:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Creating table
[INFO ] Creating index
[INFO ] distributing table
[INFO ] Insert data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Sunnyvale', state='California', zip_code='94001'}
[INFO ] Update data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Guntur', state='California', zip_code='94001'}
[INFO ] Delete data
[INFO ] Read data
[INFO ] There is no data in the database!
[INFO ] Copied 5000 rows using COPY command
[INFO ] Closing database connection
الأمر COPY لتحميل البيانات في الذاكرة
تنسخ التعليمات البرمجية التالية البيانات الموجودة في الذاكرة إلى جدول.
private static void inMemory(Connection connection) throws SQLException,IOException
{
log.info("Copying inmemory data into table");
final List<String> rows = new ArrayList<>();
rows.add("0,Target,Sunnyvale,California,94001");
rows.add("1,Apollo,Guntur,Andhra,94003");
final BaseConnection baseConnection = (BaseConnection) connection.unwrap(Connection.class);
final CopyManager copyManager = new CopyManager(baseConnection);
// COPY command can change based on the format of rows. This COPY command is for above rows.
final String copyCommand = "COPY pharmacy FROM STDIN with csv";
try (final Reader reader = new StringReader(String.join("\n", rows))) {
copyManager.copyIn(copyCommand, reader);
}
}
يمكنك الآن إضافة السطر التالي في الأسلوب الرئيسي:
inMemory(connection);
يجب أن يؤدي تنفيذ الفئة الرئيسة الآن إلى إنتاج الإخراج التالي:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: citus
[INFO ] Creating table
[INFO ] Creating index
[INFO ] distributing table
[INFO ] Insert data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Sunnyvale', state='California', zip_code='94001'}
[INFO ] Update data
[INFO ] Read data
[INFO ] Data read from the database: Pharmacy{pharmacy_id=0, pharmacy_name='Target', city='Guntur', state='California', zip_code='94001'}
[INFO ] Delete data
[INFO ] Read data
[INFO ] There is no data in the database!
5000
[INFO ] Copying in-memory data into table
[INFO ] Closing database connection
إعادة محاولة التطبيق لحالات فشل طلب قاعدة البيانات
من الممكن أحياناً أن تفشل طلبات قاعدة البيانات من التطبيق. يمكن أن تحدث مثل هذه المشكلات في ظل سيناريوهات مختلفة، مثل فشل الشبكة بين التطبيق وقاعدة البيانات، وكلمة المرور غير الصحيحة، وما إلى ذلك. قد تكون بعض المشكلات عابرة، وتحل نفسها في بضع ثوان إلى دقائق. يمكنك تكوين منطق إعادة المحاولة في تطبيقك للتغلب على الأخطاء العابرة.
يساعد تكوين منطق إعادة المحاولة في تطبيقك على تحسين تجربة المستخدم. في ظل سيناريوهات الفشل، سينتظر المستخدمون وقتاً أطول قليلاً حتى يقوم التطبيق بخدمة الطلبات، بدلاً من مواجهة الأخطاء.
يوضح المثال أدناه كيفية تنفيذ منطق إعادة المحاولة في تطبيقك. يحاول نموذج القصاصة البرمجية طلب قاعدة بيانات كل 60 ثانية (حتى خمس مرات) حتى ينجح. يمكن تكوين عدد مرات إعادة المحاولة وتكرارها استناداً إلى احتياجات التطبيق.
في هذه التعليمة البرمجية، استبدل <نظام المجموعة> باسم نظام المجموعة وكلمة <المرور بكلمة مرور> المسؤول.
package test.crud;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.logging.Logger;
import com.zaxxer.hikari.HikariDataSource;
public class DemoApplication
{
private static final Logger log;
static
{
System.setProperty("java.util.logging.SimpleFormatter.format", "[%4$-7s] %5$s %n");
log = Logger.getLogger(DemoApplication.class.getName());
}
private static final String DB_USERNAME = "citus";
private static final String DB_PASSWORD = "<password>";
private static final String DB_URL = "jdbc:postgresql://c-<cluster>.<uniqueID>.postgres.cosmos.azure.com:5432/citus?sslmode=require";
private static final String DB_DRIVER_CLASS = "org.postgresql.Driver";
private static HikariDataSource datasource;
private static String executeRetry(String sql, int retryCount) throws InterruptedException
{
Connection con = null;
PreparedStatement pst = null;
ResultSet rs = null;
for (int i = 1; i <= retryCount; i++)
{
try
{
datasource = new HikariDataSource();
datasource.setDriverClassName(DB_DRIVER_CLASS);
datasource.setJdbcUrl(DB_URL);
datasource.setUsername(DB_USERNAME);
datasource.setPassword(DB_PASSWORD);
datasource.setMinimumIdle(10);
datasource.setMaximumPoolSize(1000);
datasource.setAutoCommit(true);
datasource.setLoginTimeout(3);
log.info("Connecting to the database");
con = datasource.getConnection();
log.info("Connection established");
log.info("Read data");
pst = con.prepareStatement(sql);
rs = pst.executeQuery();
StringBuilder builder = new StringBuilder();
int columnCount = rs.getMetaData().getColumnCount();
while (rs.next())
{
for (int j = 0; j < columnCount;)
{
builder.append(rs.getString(j + 1));
if (++j < columnCount)
builder.append(",");
}
builder.append("\r\n");
}
return builder.toString();
}
catch (Exception e)
{
Thread.sleep(60000);
System.out.println(e.getMessage());
}
}
return null;
}
public static void main(String[] args) throws Exception
{
String result = executeRetry("select 1", 5);
System.out.print(result);
}
}
الخطوات التالية
- تعرف على كيفية توسيع Azure Cosmos DB لواجهة برمجة تطبيقات PostgreSQL ل PostgreSQL، وتجربة استعلامات تشخيصية مفيدة
- اختر أفضل حجم نظام مجموعة لحمل العمل الخاص بك
- مراقبة أداء نظام المجموعة