【问题标题】:Java Mysql ExceptionJava Mysql 异常
【发布时间】:2023-03-30 00:05:01
【问题描述】:

我在将数据插入数据库的查询中遇到异常,我在数据库中插入了大约 15k 行的大量数据。 这是异常消息:

The driver was unable to create a connection due to an inability to  establish the client portion of a socket.This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

我的插入查询函数:

public static void insertObject(int modelId,float x,float y,float z,float rx,float ry,float rz){

     try
        {
         con = DriverManager.getConnection(url, user, password);
          String query = " insert into wastobjects (modelid,x,y,z,rx,ry,rz)"
            + " values (?, ?, ?, ?, ?, ?, ?)";
          PreparedStatement preparedStmt = con.prepareStatement(query);
          preparedStmt.setInt (1, modelId);
          preparedStmt.setFloat (2, x);
          preparedStmt.setFloat (3, y);
          preparedStmt.setFloat (4, z);
          preparedStmt.setFloat (5, rx);
          preparedStmt.setFloat (6, ry);
          preparedStmt.setFloat (7, rz);

          preparedStmt.execute();
          con.close();
        }
        catch (Exception e)
        {
          System.err.println("Got an exception!");
          System.err.println(e.getMessage());
        }
}

【问题讨论】:

  • 您的套接字连接用完了。您正在为每一行创建一个新连接。您应该重用您的连接,或者您可以使用操作系统命令打开更多套接字。查找最大套接字连接数。你应该知道,每个socket连接都会创建一个小文件,所以会有资源限制,但是如果你增加数量,你可以创建很多连接。
  • 发布完整的堆栈跟踪
  • 我每次都很难创建一个新的连接是个坏主意,有没有我可以重复使用相同的连接?

标签: java mysql exception


【解决方案1】:

您可以重复使用您的连接,而不是在每次需要插入新行时创建一个新连接。

并尝试关闭准备好的语句和finally 块中的连接。

例如:

Connection con = null;
PreparedStatement ps = null;
try {
    // your code here.
    ps.execute();
    con.commit();
} catch (Exception e){

} finally {
    closeResource(ps)
    closeResource(con);
}

你的新方法:

private void closeResource(AutoCloseable resource) {
    if (resource != null) {
        try {
            resource.close();
        } catch (Exception e) {
        }
    }
}

这就是为什么当您遇到异常时资源不会关闭并且您将达到套接字的限制。

【讨论】:

  • public void closeResources(AutoCloseable resource) { if (resource == null) { return; } 尝试 { resource.close(); } catch (Exception e) { System.err.println(e.getMessage()); } }
【解决方案2】:
  1. 在 finally 块中关闭连接。
  2. 不要每行使用一个新连接。使用相同的连接。
  3. 事实上,如果您使用批处理,您可以使用相同的PreparedStatement

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 2013-12-08
    • 2014-11-28
    • 2012-08-07
    • 1970-01-01
    • 2014-09-18
    • 2015-12-29
    • 2014-07-27
    相关资源
    最近更新 更多