使用SQLException检查Java程序中是否存在MySQL表

时间:2012-01-10 14:23:40

标签: java mysql web-services jdbc sqlexception

我有一个Java Web应用程序,我的客户端连接到Web服务以使用其数据更新MySQL数据库(使用JDBC)。我想要做的是每次客户端连接并使用Web服务的操作时,不使用MetaData检查所请求的表是否存在。我想每次只执行INSERT,连接到Web服务的第一个客户端将导致我将捕获的SQLException,查看其ErrorCode以确定它是由{{1}}引起的不存在表,如果是这种情况,它将(在catch子句内)创建表,插入由于Exception而无法先插入的数据,然后创建一个线程来处理该特定客户端(例如检查它是否会刷新它每隔x秒在数据库中输入一次)。这个实现会完成这项工作吗?线程是否会正常运行以及所有内容,即使它将在异常的catch子句中启动?

2 个答案:

答案 0 :(得分:4)

按照您描述的方式进行操作会将您的应用程序绑定到MySQL,因为返回的异常必须作为MySQL特定的方式进行检查,以确定它们是否由缺少的表而不是其他问题引起。大多数开发人员认为将应用程序绑定到这样的特定数据库是不好的做法。

此外,如果您同时获得对同一个不存在的表的2个请求,则很可能会有2个线程尝试创建同一个表,其中一个尝试创建已存在的表时会出错,所以你需要做某种同步。

我建议您重新检查您的应用程序设计,以便提前存在所有表。如果它们绝对必须动态创建,我会创建一个单独的对象,使用MetaData来确定每个表的存在,然后将该知识缓存在对象本身中,这样您只需要在每个生命周期内搜索每个表的存在一次应用。您还可以同步此对象上的方法,以防止2个线程尝试一次创建同一个表。

答案 1 :(得分:1)

使用Exceptions作为流量控制的平均值是一种反模式,你应该避免这样做。如果您担心查询每个连接的元数据的性能影响,可以缓存结果。