2014-12-27 26 views
1

我的MYSQL表有3个表。在Java中获取MYSQL数据库大小

我无法获得given examples的工作。

Java,使用java.sql.*,我想知道我的整个数据库中剩下多少空间,因为空间非常有限。

这里是我的方法:

// this.conn = DriverManager.getConnection("jdbc:mysql://......"); 

public long remainingSpace() { 
    String sql = "SELECT table_schema AS \"Database\", " 
     + "ROUND(SUM(data_length + index_length)/1024, 2) AS \"Size (KB)\" " 
     + "FROM information_schema.TABLES GROUP BY table_schema;"; 
    ResultSet rs; 
    PreparedStatement prpSttm = this.conn.prepareStatement(sql); 
    rs = prpSttm.executeQuery(); 
    rs.next(); 
    long remainingSpace = rs.getInt("Size (KB)"); 
    return remainingSpace; 
} 

这将返回9(KB)。

phpMyAdmin的,而不是告诉我有我的一个表数据的64 KiBTable size according to phpMyAdmin

我怎样才能在Java中正确的大小?

回答

2

您只是显示了ResultSet返回的第一个数据库的大小,您的DBMS中可能有更多的数据库(有一些默认系统DB)。你应该使用一个while循环。

while (rs.next()) { 
    System.out.println(rs.getString("Database") " | " + rs.getString("Size (KB)")); 
} 

*从我的经验来看,〜9KB通常是默认information_schema数据库的大小。

**由于此查询按字母顺序返回数据库,我猜数据库的名称以字母> = i开头;因此,令人惊讶的是,如果您将数据库的名称从“a”开始,则您的代码将起作用:) :)

+0

This works!给出的代码被剪下来为我打印出以下内容:'information_schema | 9.00 sql560710 | 96.00 '谢谢! – Blauhirn 2014-12-27 15:21:57

1

您只在Java程序的ResultSet中读取一行。但是您的查询为您的服务器上的每个不同数据库(模式)生成一行。您可能会报告某些数据库的信息,而不是您的数据库。您最好阅读该ResultSet的所有行。

要注意: MySQL的磁盘空间耗尽可能是灾难性的。你真的不想完全用完磁盘空间。如果你明智,你会留下至少几个GiB的余量。