Помогите Медленная запись в SQLite.

Статус
Закрыто для дальнейших ответов.

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Совсем не знаю, что мне делать. При записи в базу проходит задержка, а если записей будет много, так вообще сервер может повиснуть, например установив блок мне нужно записывать его в базу и в мапу параллельно, что мне очень нужно, но как это сделать с минимальными задержками не знаю. Параметр synchronous отключил, но это мало дало результата. Подскажите, что можно сделать или есть какие-нибудь аналоги?
 
Y4aMrC5Evaj7OafgRypJ8aeUcuzUlg4aNrGu7fCGpErfYUPylBWOzgqx3Wm_opngAC9bTAm-bo_uKQL1tng3pA%3D%3D

Y4aMrC5Evaj7OafgRypJ8ceKSnDQZ1p4hLo5TQPmQFX0W_zRMPF3ZNL2KriCMwWuvW9YPJgougXFHR6Fl_YgMw%3D%3D
 
Почему я добавил библиотеку H2 к проекту, а он его типо не видит?
 
CompletableFuture еще, но суть в итоге одна и та же. Асинхрон из ведра проще даже будет.
В чём приемущество

Над обычным Thread?
Ну писец… эксперты собрались… Тут надо юзать асинхронный шедулер. Плодить каждый раз новый тред на новый запрос это сразу минус проц. Юзать CompletableFuture#supplyAsync без указывания екзекутора тоже хрень, так как по дефолту там юзается fork join pool - забьете его такими долгими вещами как обработка запросов из базы, то у вас сразу отвалятся вещи которые активно юзают fork join pool(паралельные стримы и тд)
 
Ну писец… эксперты собрались… Тут надо юзать асинхронный шедулер. Плодить каждый раз новый тред на новый запрос это сразу минус проц. Юзать CompletableFuture#supplyAsync без указывания екзекутора тоже хрень, так как по дефолту там юзается fork join pool - забьете его такими долгими вещами как обработка запросов из базы, то у вас сразу отвалятся вещи которые активно юзают fork join pool(паралельные стримы и тд)
Сам в другой теме писал, что можно юзать CompletableFuture для коннекта к бд, теперь сам себе противоречишь -_-. Но сейчас вроде бы по логике все объяснил, спасибо.
 
Последнее редактирование:
Сам в другой теме писал, что можно юзать Completab!eFuture для коннекта к бд, теперь сам себе противоречишь -_-. Но сейчас вроде бы по логике все объяснил, спасибо.
Ору, ты хотя бы понял, что он написал? Он говорит, что CompletableFuture надо юзать с Executor-ом, а не забивать Fork join pool, где тут противоречие то?
А по-старинке вообще никак нельзя? В этом джарнике даже этого класса толком нет.
По-старинке можно только страдать фигней и деградировать.
 
С горем пополам у меня получилось подсоединить базу, но появилась другая проблема: чтение записей происходит быстрее, чем метод executeQuery, т.е при первом запуске по идее создаются таблицы, но в этом случае происходит так, что метод чтения данных вызывается быстрее метода создания таблиц и происходит исключение.
 
С горем пополам у меня получилось подсоединить базу, но появилась другая проблема: чтение записей происходит быстрее, чем метод executeQuery, т.е при первом запуске по идее создаются таблицы, но в этом случае происходит так, что метод чтения данных вызывается быстрее метода создания таблиц и происходит исключение.
Ну так порядок поменяй. Я обычно сразу в конструкторе делаю.
 
Сделал я это примерно так (я убрал ассинхронный метод):

Код:
package ru.lisenochek.cc.sql;

import ru.lisenochek.cc.Main;
import ru.lisenochek.cc.utils.Logger;

import java.sql.*;

public class SQL {

    public static Connection connection;
    public static Statement statement;
    public static ResultSet resultSet;

    public synchronized static void closeConnection() throws SQLException {
        if (connection != null && !connection.isClosed()) connection.close();
    }

    public synchronized static void openConnection() throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        connection = DriverManager.getConnection("jdbc:h2:" + Main.plugin.getDataFolder().getAbsolutePath() + "/Database;mode=MySQL", "sa", "");
        statement = connection.createStatement();
    }

    public synchronized static void executeQuery(String query) {

        if (query == null || query.equals("")) {
            Logger.getLogger("Невозможно выполнить запрос! Он равен null или пуст!").error();
            return;
        }

        try {
            statement.execute(query);
            statement.close();
            closeConnection();
            openConnection();
        } catch (SQLException | ClassNotFoundException e) {
            Logger.getLogger("Что-то пошло не так и при запросе появилось исключение:").error();
            Logger.getLogger(e.getMessage()).error();
        }
    }
}
 
Что это такое? Постоянно после компиляции плагина такое происходит.

java.util.zip.ZipException: invalid stored block lengths
[11:14:37] [Server thread/WARN]: at java.util.zip.InflaterInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.io.FilterInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.io.FilterInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.io.PushbackInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.util.zip.ZipInputStream.readFully(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.util.zip.ZipInputStream.readLOC(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
[11:14:37] [Server thread/WARN]: at org.h2.util.Utils.loadResource(Utils.java:447)
[11:14:37] [Server thread/WARN]: at org.h2.util.Utils.getResource(Utils.java:427)
[11:14:37] [Server thread/WARN]: at org.h2.message.DbException.<clinit>(DbException.java:41)
[11:14:37] [Server thread/WARN]: at org.h2.util.JdbcUtils.loadUserClass(JdbcUtils.java:198)
[11:14:37] [Server thread/WARN]: at org.h2.value.DataType.<clinit>(DataType.java:176)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Mode.<clinit>(Mode.java:286)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Database.<init>(Database.java:171)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.openSession(Engine.java:66)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.openSession(Engine.java:179)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.createSessionAndValidate(Engine.java:157)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.createSession(Engine.java:140)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.createSession(Engine.java:28)
[11:14:37] [Server thread/WARN]: at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:351)
[11:14:37] [Server thread/WARN]: at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124)
[11:14:37] [Server thread/WARN]: at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:103)
[11:14:37] [Server thread/WARN]: at org.h2.Driver.connect(Driver.java:69)
[11:14:37] [Server thread/WARN]: at java.sql.DriverManager.getConnection(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.sql.DriverManager.getConnection(Unknown Source)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.sql.SQL.openConnection(SQL.java:20)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.sql.SQLManager.initSQL(SQLManager.java:15)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.Boostrapper.initPlugin(Boostrapper.java:35)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.Main.onEnable(Main.java:12)
[11:14:37] [Server thread/WARN]: at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264)
[11:14:37] [Server thread/WARN]: at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337)
[11:14:37] [Server thread/WARN]: at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:381)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:330)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.reload(CraftServer.java:752)
[11:14:37] [Server thread/WARN]: at org.bukkit.Bukkit.reload(Bukkit.java:525)
[11:14:37] [Server thread/WARN]: at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:27)
[11:14:37] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:634)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:444)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:407)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[11:14:37] [Server thread/WARN]: at java.lang.Thread.run(Unknown Source)
[11:14:37] [Server thread/WARN]: java.util.zip.ZipException: invalid stored block lengths
[11:14:37] [Server thread/WARN]: at java.util.zip.InflaterInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.io.FilterInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.io.FilterInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.io.PushbackInputStream.read(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.util.zip.ZipInputStream.readFully(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.util.zip.ZipInputStream.readLOC(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
[11:14:37] [Server thread/WARN]: at org.h2.util.Utils.loadResource(Utils.java:447)
[11:14:37] [Server thread/WARN]: at org.h2.util.Utils.getResource(Utils.java:427)
[11:14:37] [Server thread/WARN]: at org.h2.message.DbException.<clinit>(DbException.java:48)
[11:14:37] [Server thread/WARN]: at org.h2.util.JdbcUtils.loadUserClass(JdbcUtils.java:198)
[11:14:37] [Server thread/WARN]: at org.h2.value.DataType.<clinit>(DataType.java:176)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Mode.<clinit>(Mode.java:286)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Database.<init>(Database.java:171)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.openSession(Engine.java:66)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.openSession(Engine.java:179)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.createSessionAndValidate(Engine.java:157)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.createSession(Engine.java:140)
[11:14:37] [Server thread/WARN]: at org.h2.engine.Engine.createSession(Engine.java:28)
[11:14:37] [Server thread/WARN]: at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:351)
[11:14:37] [Server thread/WARN]: at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124)
[11:14:37] [Server thread/WARN]: at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:103)
[11:14:37] [Server thread/WARN]: at org.h2.Driver.connect(Driver.java:69)
[11:14:37] [Server thread/WARN]: at java.sql.DriverManager.getConnection(Unknown Source)
[11:14:37] [Server thread/WARN]: at java.sql.DriverManager.getConnection(Unknown Source)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.sql.SQL.openConnection(SQL.java:20)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.sql.SQLManager.initSQL(SQLManager.java:15)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.Boostrapper.initPlugin(Boostrapper.java:35)
[11:14:37] [Server thread/WARN]: at ru.lisenochek.cc.Main.onEnable(Main.java:12)
[11:14:37] [Server thread/WARN]: at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264)
[11:14:37] [Server thread/WARN]: at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337)
[11:14:37] [Server thread/WARN]: at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:381)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:330)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.reload(CraftServer.java:752)
[11:14:37] [Server thread/WARN]: at org.bukkit.Bukkit.reload(Bukkit.java:525)
[11:14:37] [Server thread/WARN]: at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:27)
[11:14:37] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648)
[11:14:37] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:634)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:444)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:407)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[11:14:37] [Server thread/WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[11:14:37] [Server thread/WARN]: at java.lang.Thread.run(Unknown Source)
 
Сделал я это примерно так (я убрал ассинхронный метод):

Код:
package ru.lisenochek.cc.sql;

import ru.lisenochek.cc.Main;
import ru.lisenochek.cc.utils.Logger;

import java.sql.*;

public class SQL {

    public static Connection connection;
    public static Statement statement;
    public static ResultSet resultSet;

    public synchronized static void closeConnection() throws SQLException {
        if (connection != null && !connection.isClosed()) connection.close();
    }

    public synchronized static void openConnection() throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        connection = DriverManager.getConnection("jdbc:h2:" + Main.plugin.getDataFolder().getAbsolutePath() + "/Database;mode=MySQL", "sa", "");
        statement = connection.createStatement();
    }

    public synchronized static void executeQuery(String query) {

        if (query == null || query.equals("")) {
            Logger.getLogger("Невозможно выполнить запрос! Он равен null или пуст!").error();
            return;
        }

        try {
            statement.execute(query);
            statement.close();
            closeConnection();
            openConnection();
        } catch (SQLException | ClassNotFoundException e) {
            Logger.getLogger("Что-то пошло не так и при запросе появилось исключение:").error();
            Logger.getLogger(e.getMessage()).error();
        }
    }
}
Код говно, иди учи основы явы.
Зачем ты убрал асинхрон?

Сам в другой теме писал, что можно юзать Completab!eFuture для коннекта к бд, теперь сам себе противоречишь -_-. Но сейчас вроде бы по логике все объяснил, спасибо.
Где противоречие? Надо юзать CompletableFuture со своим екзекутором, либо доставать бакитовский еззекутор рефлексией из CraftScheduler, либо создавать своей, первый вариант более приоритетный, так как не плодится большое кол-во ненужных потоков. Либо можно просто создавать объект CompletableFuture, создавать обычный бакит асирхрон шедулер, и сетать значение фьючеру через CompletableFuture#complete
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх