大量时间从 Java 访问数据库

Posted

技术标签:

【中文标题】大量时间从 Java 访问数据库【英文标题】:Huge time accessing database from Java 【发布时间】:2012-11-08 13:28:18 【问题描述】:

我是一名初级 Java 程序员,我终于自己编写了我的第一个程序,除了学校以外:)。

基础是:您可以在其上存储数据并随时检索它。最主要的是,我希望能够在另一台计算机上运行这个程序(作为可运行的 .jar 文件)。

因此我必须安装 JRE 和 microsoft access 2010 驱动程序(它们都是 32 位的),程序运行完美,但有 1 个小问题。

从数据库中存储或删除某些内容需要很长时间(字面意思是 17 秒)。 这是什么原因?可以改吗?

编辑:

这是将 Woord 类的对象插入数据库的代码。

public static void ToevoegenWoord(Woord woord) 
    try (Connection conn = DriverManager.getConnection("jdbc:odbc:DatabaseSenne")) 
        PreparedStatement addWoord =
            conn.prepareStatement("INSERT INTO Woorden VALUES (?)");
        addWoord.setString(1, woord.getWoord());
        addWoord.executeUpdate();
     catch (SQLException ex)  
        for (Throwable t : ex) 
            System.out.println("Het woord kond niet worden toegevoegd aan de databank.");
            t.printStackTrace();
         
    

【问题讨论】:

您能否展示有关如何连接数据并将数据插入数据库的代码。尝试谷歌搜索连接池。它可能会对你有所帮助。 学习如何分析应用程序的好时机。试试这个:docs.oracle.com/javase/6/docs/technotes/tools/share/… 你也可以随时间添加日志打印到你的代码中,看看你的问题出在哪里 我的代码没有任何问题,它运行良好,但是当我将数据插入数据库时​​很慢。 @brimborium try-with-resources 是在 SE 7 中引入的,所以我想你可以原谅不知道它;-) 【参考方案1】:

在您的情况下,每次创建连接很可能是缓慢的操作(尤其是使用 JDBC-ODBC 桥)。要确认这一点,请尝试在从 DriverManager 获取连接的行之前和之后放置带有时间戳的打印语句。如果是这种情况,请考虑不要在每个请求上打开连接,而是打开一次并重复使用,最好使用某种连接池,有plenty of options 可用。

如果情况并非如此,那么实际插入也可能很慢。再次使用 print 语句进行简单的分析应该可以帮助您发现代码大部分时间都花在了哪里。

【讨论】:

老实说,你们的意思我一半都不懂。正如我所说,我是一名初级程序员。当您谈论我还不知道/不了解的事情时,请提供一些示例或更多信息。 如果您不知道如何在 Java 中使用打印语句 (System.out.println(""+new Date())),那么从比数据库操作更简单的东西开始也许是个好主意并阅读一本关于 Java 编程的入门级书籍。 我确实知道它们,但我不知道对它们的引用,因为我没有用英语学习我的课程。但现在我知道它们只是印刷品,我知道你在说什么。我也使用它们,看看什么时候出了问题。 但是您在哪里显示带有可执行 jar 文件的所谓“日志”?不在您的控制台中,这是肯定的..【参考方案2】:

首先,恭喜您首次独立进军。要回答您的问题/详细说明 maximdim 的答案,需要关注的是:

try (Connection conn = DriverManager.getConnection("jdbc:odbc:DatabaseSenne")) 

您每次使用此函数时都可能成为主要瓶颈(或者可能是您的代码的另一部分。)最重要的是,您需要了解使用日志记录甚至标准打印语句的概念来帮助诊断您的位置看到一个问题。像这样包装单独的代码行:

System.out.println("Before Connection retrieval: " + new Date().getTime());
try (Connection conn = DriverManager.getConnection("jdbc:odbc:DatabaseSenne")) 
        System.out.println("AFTER Connection retrieval: " + new Date().getTime());

...查看每个调用经过多少毫秒可以帮助您准确确定瓶颈所在。

【讨论】:

如果速度太快,那么你可以使用System.nanoTime()来获得纳秒。这应该是足够的时间分辨率。 ;) 好吧,当我的项目尚未编译为可执行的 .jar 文件时,这会有所帮助。但是,在eclipse中,我没有这个问题。那么,我应该改用 showMessageDialogs 吗?【参考方案3】:

建议:使用另一个数据库,例如 Derby、hsqldb。它们与 MSAccess 没有太大区别(= 可以使用基于文件的数据库),但性能更好(比 JDBC/ODBC)。甚至可以嵌入到应用程序中(无需额外安装 DB)。

【讨论】:

愿意这样做。甚至考虑使用 SQLite,但我自己无法找到正确的信息来在我的程序中使用和实现它..

以上是关于大量时间从 Java 访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

开发语言大PK:php和Java哪个更好?

JNDI全面总结

在 Java 应用程序中处理大量输入数据

java正则表达式从大量日志中筛选有用数据

java正则表达式从大量日志中筛选有用数据

Java开发经典实战!java的动态代理和静态代理