Mentain SQLITE Connection بدون فتحها 1000 مرة. * بدون فتح وإغلاق بعد الاستخدام *

0

لقد أنشأت قاعدة بيانات لخادم Minecraft الخاص بي ، في Java. أستخدم Java 8 ، ولكن أريد أن أعرف كيف يمكنني توجيه اتصال SQLITE المفتوح أثناء تشغيل الخادم.

عند بدء تشغيل الخادم ، يتم فتح الاتصال وعندما أغلق ، يتم إغلاق الاتصال.

المشكلة هي أن الكود الخاص بي يستخدم PreparedStatements الذي يصل الاتصال في أي وقت عندما أريد إنشاء بيان.

الرمز الخاص بي هو: https://hastebin.com/ahinidikev.java

كيف يمكنني استخدام اتصال واحد فقط واستخدام البيان المعد من هذا الاتصال فقط ، وليس الآخرين؟

ويرجى ، من أمثلة التعليمات البرمجية ، أن يكون من السهل فهمها بالنسبة لي.

لقد حصلت على خطأ: تم إغلاق قاعدة بيانات SQLITE ، والتي يتم إعادة إنتاجها لأنني أستخدم اتصالين غير متزامنين في نفس الوقت ، ولهذا السبب أحتاج إلى اتصال متواصل

1 إجابة

0

فقط قم بتخزين كائن الاتصال ولا تغلقه ... لا يوجد شيء خاص في ذلك.
في الكود الخاص بك ، فإنك تستخدم try-with-resources وهذا يتسبب في إغلاق الاتصال ، حيث يتم إغلاق جميع العناصر القريبة من إعلان try في نهاية كتلة try-with-resources.

            try (Connection connection = connectToSQLite(); // here, you are doing that inside try(), so it will be closed at the end of try block.
                 PreparedStatement preparedStatement =
                         connection.prepareStatement("SELECT * from `dates` WHERE `uuid` =?")) {
                preparedStatement.setString(1, uuid);
                try (ResultSet resultSet = preparedStatement.executeQuery()) {
                    consumer.accept(resultSet.next());
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            } 

لذلك إذا كنت ستقوم بالاتصال مرة واحدة في onEnable ثم قمت بتخزين كائن الاتصال هذا في بعض المتغيرات ، يمكنك فقط استخدامه حيث تريد:

//field in class
private Connection connection;
//inside onEnable
connection = connectToSQLite();
//in other method:
        try (PreparedStatement preparedStatement =
                     connection.prepareStatement("SELECT * from `dates` WHERE `uuid` =?")) {
            preparedStatement.setString(1, uuid);
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                consumer.accept(resultSet.next());
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } 

ولكن لاحظ أن الاتصال قد يفشل لأسباب عديدة أخرى وقد تحتاج إلى إعادة الاتصال ، وقد يكون من الجيد استخدام بعض التجميع ، فهناك مكتبات لذلك ، مثل HikariCP ، فإنك لا تزال "تغلق" اتصالك ، ويمكنك (و ينبغي) استخدام التجربة مع الموارد ولكن هذا الاتصال من المكتبة بدلاً من إغلاق نفسه سيعود فقط إلى مجموعة الاتصالات.
كما يسمح لك باستخدام هذه الاتصالات بطريقة بسيطة للغاية في سلاسل رسائل متعددة.

:مؤلف
فوق
قائمة طعام