连接到MySQL数据库java

连接到MySQL数据库java,java,mysql,Java,Mysql,我正在为多线程MySQL系统使用一些代码。它工作正常,将在半秒钟内将条目输入我的数据库。我的问题是,我的程序成功连接和写入数据库的速度不是很快。有时它可以正常工作,但有时我会收到此错误或类似错误: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 27,697

我正在为多线程MySQL系统使用一些代码。它工作正常,将在半秒钟内将条目输入我的数据库。我的问题是,我的程序成功连接和写入数据库的速度不是很快。有时它可以正常工作,但有时我会收到此错误或类似错误:

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

The last packet successfully received from the server was 27,697 milliseconds ago.  The last packet sent successfully to the server was 1 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3670)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3559)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4110)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)
    at MySQL.putEntry(MySQL.java:46)
    at MySQL.main(MySQL.java:105)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3119)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3570)
    ... 9 more
我真的不知道为什么会这样?从一个地址执行过多语句?? 不管是谁,这是我的密码:

private final ThreadedSQL sql;
private final DatabaseConnection connection;
private PreparedStatement statement;

public Hiscores() {
    try {
        loadConfig();
    } catch (IOException e) {
        e.printStackTrace();
    }
    sql = new ThreadedSQL(config);
    connection = sql.getConnectionPool().nextFree();
}

public void putEntry(final Player player) {
    try {
        statement = connection.getConnection().prepareStatement(QUERY(player));
        statement.execute();
        statement.closeOnCompletion();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

我没有包含的代码是无关的,它使用java.sql.Connection。有人知道为什么会这样吗?谢谢。

一旦完成,您应该关闭您的语句和连接,否则资源池可能会耗尽,或者您的连接可能会超时。我建议从一些JDBC池获得新连接。几年前,我曾在servlet环境中使用proxool。如果您使用的是J2EE,那么ApplicationServer将为您完成这项工作,但您必须使用DataSource。

我只是想知道这句话:prepareStatement(QUERY(player));当您需要设置参数时,应使用PreparedStatement。您确定使用后释放了资源吗?您需要在finally块中按此顺序关闭结果集、语句和连接,否则可能会发生各种奇怪的异常。JDBC驱动程序将保存一些数据,RDBMS也可以保存这些数据。尝试正确地清理。嗨,谢谢你的评论。查询方法只是一个字符串,player参数只是用于获取播放器的名称和一些其他字段。至于释放资源,我关闭了您可以看到的语句:statement.closeOnCompletion()。我没有研究这个方法,我只是假设它关闭了它。我没有得到结果集,是吗?我只是将数据放入数据库,这需要结果集吗?最后,我必须关闭连接,我想让它保持打开状态,通过一个连接继续执行语句,也许我应该阅读文档。谢谢,问题是我没有关闭连接。每次创建到数据库的新连接都会大大增加将数据放入数据库所需的时间,有什么办法吗?1)您使用的是某种连接池(我假设),所以不要担心,关闭它,它下次会重用它。若您将它保持在对象生命周期中,您永远不知道垃圾收集器何时会关闭它。它甚至可能超时,所以你会收到这样的通信错误。