Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
200 views
in Technique[技术] by (71.8m points)

java - HikariCP connection error

Im trying to use HikariCP with a mariaDB database but i getting the next error when im trying to initialize.

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.zaxxer.hikari.pool.HikariPool.initializeConnections(HikariPool.java:581) ~[Dubilets-1.0-SNAPSHOT.jar:?]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:152) ~[Dubilets-1.0-SNAPSHOT.jar:?]
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:73) ~[Dubilets-1.0-SNAPSHOT.jar:?]
at eu.elraro.dubilets.storage.Database.<init>(Database.java:69) [Dubilets-1.0-SNAPSHOT.jar:?]
at eu.elraro.dubilets.storage.MariaDBDatabase.<init>(MariaDBDatabase.java:18) [Dubilets-1.0-SNAPSHOT.jar:?]
at eu.elraro.dubilets.Dubilets.realizaConexion(Dubilets.java:168) [Dubilets-1.0-SNAPSHOT.jar:?]
at eu.elraro.dubilets.Dubilets.inicializaVariables(Dubilets.java:164) [Dubilets-1.0-SNAPSHOT.jar:?]
at eu.elraro.dubilets.Dubilets.onEnable(Dubilets.java:69) [Dubilets-1.0-SNAPSHOT.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at net.minecraft.server.v1_8_R3.MinecraftServer.s(MinecraftServer.java:414) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at net.minecraft.server.v1_8_R3.MinecraftServer.k(MinecraftServer.java:378) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at net.minecraft.server.v1_8_R3.MinecraftServer.a(MinecraftServer.java:333) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:263) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:524) [spigot-1.8.8-R0.1-SNAPSHOT-latest.jar:git-Spigot-fdc1440-53fac9f]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_66]

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

My MariaDBDatabase class:

public class MariaDBDatabase extends Database {

/*
 * Construct a MySQL database instance.
 *
 * @param host     Host/IP of the MySQL database.
 * @param port     Port of the MySQL database.
 * @param database Database wanted to be access.
 * @param username Username to be authenticated with.
 * @param password Password for the user authentication.
 * @param plugin   Plugin for the schedulers to be assigned to.
 */
public MariaDBDatabase(String host, int port, String database, String username, String password, JavaPlugin plugin) {
    super("org.mariadb.jdbc.MySQLDataSource", "jdbc:mysql://" + host + ":" + port + "/" + database, username, password, plugin);
}

My Database class:

public abstract class Database {

private String           jdbcURL;
private HikariDataSource dataSource;
private JavaPlugin       plugin;

/**
 * Construct a database instance.
 *
 * @param className The class name used to get the driver.
 * @param jdbcURL   A JDBC url to use for connecting.
 * @param username  Username to connect with.
 * @param password  Password to authenticate username.
 * @param plugin    A plugin instance for the schedulers to be assigned to.
 */
public Database(String className, String jdbcURL, String username, String password, JavaPlugin plugin) {
    this.jdbcURL = jdbcURL;
    this.plugin = plugin;

    try {
        Bukkit.getLogger().log(Level.INFO, "Initializing the connection pool ... ");
        Class.forName(className);
    } catch (ClassNotFoundException e) {
        Bukkit.getLogger().log(Level.SEVERE, "Exception when trying to initialize the connection pool",e);
        return;
    }

    HikariConfig config = new HikariConfig();

    config.setDriverClassName(className);
    config.setJdbcUrl(jdbcURL);

    config.setUsername(username);
    config.setPassword(password);

    //config.setLeakDetectionThreshold(10000);
    //config.setMaximumPoolSize(10);

    config.setMaximumPoolSize(5);
    config.setConnectionTestQuery("SELECT 1");
    config.setPoolName("HikariCP");

    try {
        dataSource = new HikariDataSource(config);
        Bukkit.getLogger().log(Level.INFO, "Connection pool initialized successfully.");
    } catch (Exception e) {
        Bukkit.getLogger().log(Level.SEVERE, "Exception when trying to initialize the connection pool",e);
    }
}

/**
 * Connects the data pool to the database.
 */
public boolean connect() {
    return isConnected();
}

/**
 * Disconnects (shutdown) the data pool and all connections.
 */
public void disconnect() {
    dataSource.shutdown();
}

/**
 * Query the database and return a cached result.
 *
 * @param query The statement to be queried.
 * @return      Cached rowset returned from query.
 */
public CachedRowSet query(final PreparedStatement preparedStatement) {
    CachedRowSet rowSet = null;

    if (isConnected()) {
        try {
            ExecutorService exe = Executors.newCachedThreadPool();

            Future<CachedRowSet> future = exe.submit(new Callable<CachedRowSet>() {
                public CachedRowSet call() {
                    try {
                        ResultSet resultSet = preparedStatement.executeQuery();

                        CachedRowSet cachedRowSet = new CachedRowSetImpl();
                        cachedRowSet.populate(resultSet);
                        resultSet.close();

                        preparedStatement.getConnection().close();

                        if (cachedRowSet.next()) {
                            return cachedRowSet;
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                    return null;
                }
            });

            if (future.get() != null) {
                rowSet = future.get();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    return rowSet;
}

/**
 * Execute a query
 *
 * @param preparedStatement query to be executed.
 */
public void execute(final PreparedStatement preparedStatement) {
    if (isConnected()) {
        Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
            public void run() {
                try {
                    preparedStatement.execute();

                    preparedStatement.getConnection().close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

/**
 * Prepare a statement
 *
 * @param query Query to be prepared.
 * @param vars  Variables to be replaced from ?.
 * @return      a prepared statement.
 */
public PreparedStatement prepareStatement(String query, Object... vars) {
    try {
        PreparedStatement preparedStatement = getConnection().prepareStatement(query);

        int x = 0;

        if (query.contains("?") && vars.length != 0) {
            for (Object var : vars) {
                x++;
                if (var instanceof String) {
                    preparedStatement.setString(x, (String) var);
                } else {
                    preparedStatement.setInt(x, (Integer) var);
                }
            }
        }

        return preparedStatement;
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return null;
}

/**
 * Get a connection from the data pool
 *
 * @return a connection.
 */
public Connection getConnection() {
    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return null;
}

/**
 * Check if the data pool is connected.
 *
 * @return connected Whether the data pool is connected or not.
 */
public boolean isConnected() {
    try {
        dataSource.getConnection();
    } catch (SQLException e) {
        return false;
    }

    return true;
}

My pom.xml

<project
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>eu.elraro.dubilets</groupId>
<artifactId>Dubilets</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
    <repository>
        <id>bungeecord-repo</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </repository>
</repositories>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <artifactSet>
                    <includes>
                        <include>org.slf4j:*</include>
                        <include>com.zaxxer:*</include>
                        <include>org.mariadb.jdbc:*</include>
                        <include>org.javassist:javassist</include>
                    </includes>
                </artifactSet>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <!--Spigot API -->
    <dependency>
        <groupId>org.spigotmc</groupId>
        <artifactId>spigot-api</artifactId>
        <version>1.8.8-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <!--Bukkit API -->
    <dependency>
        <groupId>org.bukkit</groupId>
        <artifactId>bukkit</artifactId>
        <version>1.8.8-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.4.1</version>
        <scope>compil

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Don't set both the dataSourceClassname and jdbcUrl ... they are mutually exclusive. For simplicity, I recommend the jdbcUrl.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...