随着时间的推移,我的数据库失去选择的原因是这个带有autoReconnect属性的URL的结果吗



我有一些代码使用JDBC连接到数据库,使用基本URL:

String url = "jdbc:mysql://" + getHostname() + ":" + getPort();

我使用以下论点:

setProperty("connectTimeout", "2000");
setProperty("autoReconnect", "true");

我不包括数据库名称,因为它可能还不存在。我在连接时检查是否存在一个,并根据需要创建它。然后我选择数据库。

我使用两个查询:

CREATE DATABASE IF NOT EXISTS <name>

然后

USE <name>

因此,在连接时会在此处选择数据库。

我遇到的问题是,我在日志中看到了一个错误:

...
Caused by: java.sql.SQLException: No database selected

这没有意义,因为数据库在连接时总是被选中,否则就会引发异常。但是,此关于缺少选择的异常会在数小时后发生。

我的猜测是,在重新连接时,它会使用URL,其中不包括数据库名称。所以它重新连接,但现在数据库没有被选中。

有人能确认这是否是我所经历的行为的原因吗?

有一个选项createDatabaseIfNotExist可以做到这一点。然后连接器将连接到没有数据库的服务器,创建不存在的数据库并连接到该数据库。然后必须在连接字符串中显式设置数据库,如
"jdbc:mysql://myHost:3306/myDB?createDatabaseIfNotExist=true">

优点是,如果连接失败,autoreconnect将直接连接到数据库。

是的,因此,不要在没有数据库名称的情况下进行连接。

尝试使用名称连接。在catch块中,检查这是否是问题所在(SQLException有一个.getState()方法,它返回一个特定的错误代码,对照mysql的表进行检查,或者只是运行传递一个不存在dbname的DB URL的代码,然后打印出来,现在你知道了(-如果是,运行一个方法,创建一个新的连接(没有dbname(,创建数据库,关闭该连接,然后返回。然后使用数据库名称重试。请记住,可以捕获异常。

String url = "jdbc:mysql://" + getHostname() + ":" + getPort();

您应该包括您的数据库名称。您的URL后面跟着一个"/DBNAME";。

USE database用于后续语句。命名数据库在会话结束之前一直保持默认状态。您的会话到期。

如果您在运行中创建数据库,则可以使用末尾带有数据库名称的完整URL再次连接,而不是使用USE database

最新更新