2014-03-25 71 views
0

我有一个简单的问题。我正在编写用于从数据库生成报告的桌面应用程序,并且我想从数据库中获取所有表和列(没有选择仅查询表和列的结果)将其放入列表中,用户可以选择它并使用它来构建自己的查询。我写了自己的代码来做到这一点,但速度很慢。如果你看到SQuirreL SQL Client,你会知道我的意思。我知道这是一些图书馆,但它们很大。Java缓存数据库表和列

我使用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<String, List<String>>

+0

如果您对表名和列名使用SELECT语句,那么为什么不能将它们放入列表中?哪里有问题? – stepanian

+0

现在让我来做,但是这是一个相当缓慢的过程,我想加快 – insict

+0

你是什么意思慢?性能明智吗?或者编码? – stepanian

回答

1

我建议,你这样做在线程并行。您可以使用ExecutorService并尝试使用不同的线程池大小,以查看处理与RAM之间的更高效。

+0

好的,我会试试这个。也许这是因为我在虚拟机上有一个数据库,而我工作的计算机没有速度恶魔。 – insict