Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作。_Java_Mysql_Sql_Asynchronous - Fatal编程技术网

Java MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作。

Java MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作。,java,mysql,sql,asynchronous,Java,Mysql,Sql,Asynchronous,所以我做了一堆异步调用,唯一的问题是,在我生成PreparedStatement的prepare方法中,它获取了连接(如果连接有故障,则使用一个新的连接),并且出于某种原因仍然抛出这个错误 我最初认为(现在仍然是这样),这是因为调用此方法的大多数用例都是异步调用的。因此,我使该方法同步(以前从未使用过该关键字,但经过一点研究后认为它是合适的),但该方法仍然会抛出一个错误 public synchronized PreparedStatement prepare(String statement)

所以我做了一堆异步调用,唯一的问题是,在我生成PreparedStatement的prepare方法中,它获取了连接(如果连接有故障,则使用一个新的连接),并且出于某种原因仍然抛出这个错误

我最初认为(现在仍然是这样),这是因为调用此方法的大多数用例都是异步调用的。因此,我使该方法同步(以前从未使用过该关键字,但经过一点研究后认为它是合适的),但该方法仍然会抛出一个错误

public synchronized PreparedStatement prepare(String statement) throws SQLException {
    Connection c = getConnection();
    if (c == null || c.isClosed()) return getNewConnection().prepareStatement(statement);
    Logger.debug("not null and not closed " + Thread.currentThread().getId());
    return c.prepareStatement(statement); //throws error here
}

如何使其他线程在prepare方法完成之前不能更改连接?

类似的情况正在发生:

线程1:调用
prepare()

线程1:开始运行查询

线程2:输入prepare并检查连接是否正常——这与线程1创建并使用的连接相同

线程1:关闭连接

线程2:尝试调用连接上的prepareStatement,该连接现已关闭


您应该研究使用连接池,该连接池将为每个线程提供自己的连接,该连接在“关闭”时返回到池。

getConnection()做什么?返回当前保存在内存中的连接最初由getNewConnection初始化,但每次使用后连接都会关闭,但当我再次需要连接时,我希望能够得到一个。。。我想这应该行得通,但就是不行。连接在哪里关闭?基本上,问题是您对单个连接的使用只是部分同步的。我最终只是在关闭连接的方法中删除了关闭(连接)。我仍然不知道如何正确地同步所有这些/如果您使用的连接实现恰好是线程安全的,那么这可能会起作用。但一旦您开始依赖连接的状态(例如使用事务),它将不再正常工作。最简单的解决方案是,每个线程在启动时分配一个连接,将该连接作为参数传递给prepare等函数,然后在连接终止时关闭连接。这将导致启动线程的成本很高,因为它需要打开一个新的连接,并且您将需要与线程数量相同的连接,这可能太多了。在线程1完成之前,synchronize不应该阻止线程2进入该方法吗?线程1不会在该同步方法中运行查询或关闭连接——它只是创建PreparedStatement。其余部分在其他地方完成,而不是同步。我已经把描述弄清楚了。