【问题标题】:Java cache database tables and columnsJava缓存数据库表和列
【发布时间】:2014-05-02 23:43:56
【问题描述】:

我有一个简单的问题。我正在编写用于从数据库生成报告的桌面应用程序,我想从数据库中获取所有表和列(没有选择查询的结果,只有表和列)将其放入列表中,用户可以在其中选择它并用于构建自己的查询.我已经编写了自己的代码来执行此操作,但是速度很慢。如果您看到 SQuirreL SQL Client,您就会明白我的意思。我知道有一些库可以做到这一点,但它们很大。

我使用SELECT查询获取所有表名,然后使用SELECT查询从该表名中获取列。

我的代码:

public List<String> getTables() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    List<String> tables = new ArrayList<String>();
    try {
        conn = getConnection();
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT name FROM sys.Tables");
        while (rs.next()) {
            tables.add(rs.getString(1));
        }
    } catch (SQLException sqle) {
        sqle.printStackTrace();
    } finally {
        DbUtils.closeQuietly(conn, stmt, rs);
    }
    return tables;
}

public List<String> getColumns(String table) {
    Connection conn = null;
    Statement smt = null;
    ResultSet rs = null;
    // DatabaseMetaData dm = null;
    List<String> colList = new ArrayList<String>();
    try {
        conn = getConnection();
        // dm = conn.getMetaData();
        smt = conn.createStatement();
        rs = smt.executeQuery("SELECT COLUMN_NAME FROM " + dbName
                + ".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + table
                + "' AND TABLE_SCHEMA = 'dbo' ORDER BY 1");
        // rs = dm.getPrimaryKeys(null, null, tName);
        while (rs.next()) {
            colList.add(rs.getString(1));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        DbUtils.closeQuietly(conn, smt, rs);
    }
    return colList;
}

一切都交给Map&lt;String, List&lt;String&gt;&gt;

【问题讨论】:

  • 如果你对表名和列名使用SELECT语句,那为什么不能把它们放在列表中呢?问题出在哪里?
  • 现在是这样,但这是一个相当缓慢的过程,我想加快速度
  • 慢是什么意思?性能明智?还是编码?
  • 数据库大约有150个表,这意味着执行了151个查询选择。整个过程平均需要一分钟。 SQuirreL SQL 在 3-5 秒内完成此操作。
  • 即使你有一千张桌子也不应该花那么长时间。你的代码有问题。你为什么不把它贴出来让我们告诉你发生了什么?

标签: java database caching


【解决方案1】:

我建议不要在循环中运行代码来遍历每个表,而是在线程中并行执行。您可以使用 ExecutorService 并尝试不同的线程池大小,看看在处理方面与 RAM 相比哪个更有效。

【讨论】:

  • 好的,我会试试这个。也许这是因为我在虚拟机上有一个数据库,而我正在使用的计算机不是速度恶魔。
猜你喜欢
  • 1970-01-01
  • 2018-12-03
  • 2015-01-20
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多