用Java插入MySQL的最快方法

时间:2011-11-15 14:40:09

标签: java mysql jdbc

我有一个服务端点,基本上将一些数据插入到mysql中。我正在寻找在mysql中插入行的最快方法。

我不介意它是非常冗长还是需要更长时间才能进行更改(与使用hibernate相比),因为这个servlet的范围非常小,但性能确实是最重要的。

我对java / servlets很新,所以请不要遗漏任何细节或者在我的最后承担很多细节。

6 个答案:

答案 0 :(得分:4)

最快的方法可能是直接使用JDBC驱动程序并自己编写SQL。 以下是一些看起来不错的示例代码:http://www.roseindia.net/jdbc/jdbc-mysql/InsertValues.shtml

人们使用Hibernate有很多原因。除了使类更简单地将类映射到数据库表之外,它还处理缓存,连接池和类似的东西。打开一个新的数据库连接会花费很多时间,所以你必须自己实现这样的东西,以使servlet运行良好。

答案 1 :(得分:2)

最快的方法是通过JDBC批量插入:

http://www.roseindia.net/jdbc/Jdbc-batch-insert.shtml

答案 2 :(得分:2)

使用JDBC和不同方法比较插入速度。它适用于PostgreSQL,但MySQL的方法和结果类似:http://rostislav-matl.blogspot.com/2011/08/fast-inserts-to-postgresql-with-jdbc.html

简而言之:使用批处理插入(可能在任何JDBC驱动程序中支持),并且在可用的地方考虑COPY FROM。

答案 3 :(得分:0)

请务必使用连接池或类似的东西。这是迄今为止最大的因素。

使用实际持久存在于servlet请求中的PrepraredStatement也可能有助于避免MySQL每次都解析请求。

只需保持数据库连接以及PreparedStatement中的ThreadLocal,即可假设servlet容器使用线程池。

更新: c3p0显然实现了连接和语句池,所以我只是使用它。

答案 4 :(得分:0)

如果您不使用JPA,我建议您使用Spring中的JdbcTemplate(即使您不使用Spring)来管理连接(关闭它们等)。

使用PreparedStatements。

不要直接初始化驱动程序/连接。而是使用在应用程序服务器中配置的池化DataSource(可以使用@Resource注入它)。

使用EJB进行事务管理。

答案 5 :(得分:0)

如果您只插入一行,那么简单的插入(可能是准备好的查询)可能是最快的。使用连接池,这样您就不必每次都连接,并且数据库上有调整参数会产生影响。

如果你能逃脱它,我建议不要在servlet中实际插入,而只是将数据放入由另一个线程插入数据库的内存队列中。但是,您不会知道它是否在servlet响应中成功。

http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html